N
nobull
This newsgroup does not exist (see FAQ). Please do not start threads
here. Particuarly, not ones asking really interesting questions since
it means most people don't get a chance to see them.
On refection, since the question was really interesting I've decided
to follow-up myself and cross-post to comp.lang.perl.misc where people
using correctly configured newsspools will be able to see it.
my @list = ("field1 field2 field3");
sub stripws($)
{
$_[0] =~ s/\s//g;
return $_[0];
}
foreach (@list)
{
my $x = stripws(substr($_,10,10));
print "$x\n";
}You would expect $x to be equal to 'field2',
No I wouldn't.
but instead $x is 'field2fiel'
Yep, that is correct.
Is there something I am missing here or is this a bug?
Excellent question!
You are missing two totally separate things.
The first is pretty basic. The elements of @_ are *aliases* not
*copies* of the arguments passed to a subroutine.
sub foo { $_[0] = 'Cooked' };
my $q='Raw';
foo($q);
print "$q\n"; # Prints 'Cooked'
The second is much more subtle. The substr() function in Perl does
not, in fact, return a string. It returns a special thing - an SV
with substr magic. Usually if you use substr() in a rvalue context
you can ignore this subtlty.
But if you make a reference or an alais to the value returned by
substr() you cannot ignore it or, as you have found, strange things
happen.
my $s='xxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
my $x = \substr($s,10,10); # Ref to SV with substr magic
$s = '0123456789Wierd, eh??';
print "$$x\n"; # Prints 'Wierd, eh?';
$$x= 'Just totally crazy';
print "$s\n"; # Prints '0123456789Just totally crazy?'
$s = "field1 field2 field3";
$$x =~ s/\s//g;
print "$$x\n"; # Prints 'field2fiel'
Weird, but not a bug.