http://www.perlmonks.org?node_id=525446

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 (Bishop) 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 = 'foo.pl'; # or $script = <STDIN>; chomp $script; $path = '/some/path/'; $script = $path . $script;
    I'll do:
    $script = '/some/path'; $script .= 'foo.pl'; # 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;

      emc

      " 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 [id://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

      Works for variables, but not for constants:

      "prepended value" .= $var; # this reverse orientation of assignment is not supported in Perl

      Maybe future versions of Perl will allow such reverse order (for constants), and then, maybe, also appendment operator could work also in prependment mode, but more universal seems having 2 operators: .= and =. (: this could continue in meditations :).

      Appendment = appending assignment, prependment = prepending assignment. :)