substr() as subroutine argument -> weird behaviour

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top