Perl problem, possible bug?

Discussion in 'Perl' started by Jim Dawson, Aug 14, 2003.

  1. Jim Dawson

    Jim Dawson Guest

    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.
     
    Jim Dawson, Aug 14, 2003
    #1
    1. Advertising

  2. Jim Dawson

    Guest

    substr() as subroutine argument -> weird behaviour

    Earlier today, in comp.lang.perl, I <> 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.

    > (Jim Dawson) wrote:
    >
    > > 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.
     
    , Aug 14, 2003
    #2
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Steve Holden
    Replies:
    1
    Views:
    422
    Behrang Dadsetan
    Jul 2, 2003
  2. Michael Fellinger
    Replies:
    3
    Views:
    187
    Michael Fellinger
    Dec 27, 2007
  3. Ala Qumsieh

    Perl core dumping - possible bug?

    Ala Qumsieh, Sep 12, 2005, in forum: Perl Misc
    Replies:
    3
    Views:
    111
    Anno Siegel
    Sep 14, 2005
  4. hara
    Replies:
    6
    Views:
    179
    Peter Scott
    May 27, 2006
  5. Replies:
    2
    Views:
    111
    Sisyphus
    Sep 15, 2006
Loading...

Share This Page