Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

What operator prepends?

by EdwardG (Vicar)
on Jan 25, 2006 at 14:05 UTC ( #525446=perlquestion: print w/replies, xml ) Need Help??
EdwardG has asked for the wisdom of the Perl Monks concerning the following question:

The .= operator appends and is very useful.

Where is the prepend operator?


Replies are listed 'Best First'.
Re: What operator prepends?
by Roy Johnson (Monsignor) on Jan 25, 2006 at 14:17 UTC
    It wasn't a useful enough operation to merit its own operator. However, you can use substr to much the same effect:
    substr($str, 0, 0) = 'new prefix'; # or 4-arg form: substr($str, 0, 0, 'new prefix');

    Caution: Contents may have been coded under pressure.
Re: What operator prepends?
by Fletch (Chancellor) on Jan 25, 2006 at 14:35 UTC

    Really .= isn't an "append operator" it's just syntactic sugar for an assignment back to the same lvalue after using the concatenation operator, just like += is syntactic sugar for adding and assigning in one step. It's just that, unlike addition (or the other mathematical operators), concatenation isn't commutative.</pedant>

    Not that it's really an answer as to why there's no prepend operator . . .

Re: What operator prepends?
by pKai (Priest) on Jan 25, 2006 at 14:16 UTC
    substr maybe?

    Depends what you want to accomplish with "prepending".

Re: What operator prepends?
by kwaping (Priest) on Jan 25, 2006 at 16:43 UTC
    Add my vote for creating a prepend operator! Until then, unfortunately you'll have to use substr as mentioned above, or simply type:
    $var = $prepended_value . $var;
Re: What operator prepends?
by Tanktalus (Canon) on Jan 25, 2006 at 17:57 UTC

    Usually, when I want to prepend, I just change the order of operations into an append. Instead of:

    $script = ''; # or $script = <STDIN>; chomp $script; $path = '/some/path/'; $script = $path . $script;
    I'll do:
    $script = '/some/path'; $script .= ''; # or $script .= <STDIN>; chomp $script;
    Often, I find that this actually makes more sense in my head because I'm building my string from left to right, which is how I think of the string.

    Alternatives is to build the string from pieces using sprintf or join. And, in my particular example, an option would be to use the join-like File::Spec.

      Why not just something like

      $string = $prefix . $string;


      " When in doubt, use brute force." — Ken Thompson

        First off, "= [...] ." isn't an operator as per the original topic. That's two operators. ;-)

        However, more importantly, this is just not how I mentally think of creating a string. If I want to generate a string such as "this is the output", I don't think about starting with the string "output" and prepending a bunch of stuff. I think about how to create "this", then I think of how to create "is", etc. It's actually quite rare that I'll want to generate "the" before I generate "is". In fact, I often end up with code like this:

        my @text; push @text, generate_this(); push @text, generate_is(); push @text, generate_the_output(); return join ' ', @text;
        That's just how I think of the string, and I find that when my code matches the problem in my head, it's far less likely to have bugs in it. Especially expensive design bugs.

Re: What operator prepends?
by ptum (Priest) on Jan 25, 2006 at 17:54 UTC

    Heh. Or maybe it is just a matter of perspective. Taking kwaping's example above, one man's append is another man's prepend, if you don't care which variable you end up with:

    $prepended_value .= $var;

    No good deed goes unpunished. -- (attributed to) Oscar Wilde

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://525446]
Approved by g0n
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (5)
As of 2018-06-20 04:32 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (116 votes). Check out past polls.