$_="abcdef"; s/@{[s".."."gr]}/$& /; print;

This variation of yours does in fact work (prints "abc def"), and so do the following ones (which are closer to the original solution by "tails"):

s/@{[s".."."gr]}\K/ /;
s/@{[s".."."gr]}\K/$"/;

Thus I conclude that the original "solution" is the result of a typo (separator '/' put in the wrong place), and cannot work.

As for how the corrected variations listed above work, lets break it down:

1)

s".."."gr;

If the input string in $_ has an even number of characters (which seems to be implicitly assumed here), then this expression will return a string consisting of only dots, of half the length of the input string. E.g. for the input string "abcdef" it returns "...".

2)

@{[ ]}

This is a common trick to execute a piece of code, and insert the code's return value directly into a string without introducing a temporary variable. It works because Perl interpolates anything that looks like an array variable inside a string.

3)
The above two expressions combined, will effectively produce the following substitution command in case of the input string "abcdef" (for the three different variations listed above):

s/.../$& /;
s/...\K/ /;
s/...\K/$"/;

All of them do the same thing: Insert a space after the third character of the original string, i.e. right in the middle.
(If you're still confused, see perlreref for an explanation of \K and $&.)

------
why $" is different from literal space character in this regex?

It isn't, unless you've manually changed that variable.
Maybe the author just liked a little obfuscation, or wanted to make it more "generic".


In reply to Re: strange usage of s/// by smls
in thread strange usage of s/// [solved: Perl 5.14 and 5.16 bug] by brx

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.