############### CUT HERE ###############
#!/usr/bin/perl -w
my @list = ("field1 field2 field3");
sub stripws($)
{
$_[0] =~ s/\s//g;
return $_[0];
}
foreach (@list)
{
my $x = stripws(substr($_,10,10));
print "$x\n";
}
############### CUT HERE ###############
Here 'field2' represents a variable-length field. I want to strip out
that column, remove whitespace from it, and assign it to $x. You would
expect $x to be equal to 'field2', but instead $x is 'field2fiel', as
if it is stripping the whitespace before calling the stripws()
function.
Is there something I am missing here or is this a bug?
Thanks in advance.
Really, really bad subject line.
Subject line should explain the subject of the post.
See
http://www.cpan.org/authors/id/D/DM/DMR/subjects.post
> 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.
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.
> 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.