Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Perl problem, possible bug?

0 views
Skip to first unread message

Jim Dawson

unread,
Aug 13, 2003, 11:59:07 PM8/13/03
to
I was writing a subroutine to extract fields from lines of text when I
ran into an issue. I have reproduced this error on Perl 5.8 on AIX,
5.8 on Linux and 5.6 on Windows.

############### 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.

nob...@mail.com

unread,
Aug 14, 2003, 7:03:09 AM8/14/03
to
jimd...@myrealbox.com (Jim Dawson) wrote in message news:<e1f9bda.03081...@posting.google.com>...
> Subject: Perl problem, possible bug?

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.

nob...@mail.com

unread,
Aug 14, 2003, 2:19:41 PM8/14/03
to
Earlier today, in comp.lang.perl, I <nob...@mail.com> wrote:

> 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.

0 new messages