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.
| [reply] [d/l] |
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 . . .
| [reply] [d/l] [select] |
Re: What operator prepends?
by pKai (Priest) on Jan 25, 2006 at 14:16 UTC
|
| [reply] |
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;
| [reply] [d/l] [select] |
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. | [reply] [d/l] [select] |
|
$string = $prefix . $string;
emc
" When in doubt, use brute force." — Ken Thompson
| [reply] [d/l] |
|
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. | [reply] [d/l] |
|
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
| [reply] [d/l] |
|
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. :)
| [reply] [d/l] [select] |