Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

$1 does not reset to undef

by snk (Novice)
on Oct 25, 2013 at 11:15 UTC ( #1059621=perlquestion: print w/ replies, xml ) Need Help??
snk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks,

I have that small piece of code and the output below. Do you have any idea about what is wrong?

What I want to perform is to select lines which do not have : at the first word.

This regexp works as expected on web based regular expression testers but not on the system.

Any help is appreciated. Thanks in advance..
my @arry=( 'bond0.2 Link encap:Ethernet', 'bond4.3:6 Link encap:Ethernet', 'bond3 Link encap:Ethernet', 'bond5:0 Link encap:Ethernet', 'bond1.5:2 Link encap:Ethernet', 'bond2.6 Link encap:Ethernet' ); foreach (@arry) { /^([\w\.]+)\s+Link.*$/; if($1) { printf "Array item: %-30s\tmatch: %s\n",$_,$1; } }
=---- Output ----=
Array item: bond0.2 Link encap:Ethernet match: bond0.2 Array item: bond4.3:6 Link encap:Ethernet match: bond0.2 Array item: bond3 Link encap:Ethernet match: bond3 Array item: bond5:0 Link encap:Ethernet match: bond3 Array item: bond1.5:2 Link encap:Ethernet match: bond3 Array item: bond2.6 Link encap:Ethernet match: bond2.6

Comment on $1 does not reset to undef
Select or Download Code
Re: $1 does not reset to undef
by McA (Curate) on Oct 25, 2013 at 11:29 UTC

    Hi

    the driver of your if-clause should be the match itself:

    if(/^([\w\.]+)\s+Link.*$/) { # bla }

    Regards
    McA

      Thanks for swift response..It works now. Thanks ;)
Re: $1 does not reset to undef
by keszler (Priest) on Oct 25, 2013 at 11:31 UTC
    As you noticed, $1 does not get set to undef on a failed match. The solution is to test the match:
    use strict; use warnings; my @arry=( 'bond0.2 Link encap:Ethernet', 'bond4.3:6 Link encap:Ethernet', 'bond3 Link encap:Ethernet', 'bond5:0 Link encap:Ethernet', 'bond1.5:2 Link encap:Ethernet', 'bond2.6 Link encap:Ethernet' ); foreach (@arry) { if (/^([\w\.]+)\s+Link.*$/) { printf "Array item: %-30s\tmatch: %s\n",$_,$1; } }
Re: $1 does not reset to undef
by Bloodnok (Vicar) on Oct 25, 2013 at 11:41 UTC
    TIMTOWTDI, try ...
    my @arry=( 'bond0.2 Link encap:Ethernet', 'bond4.3:6 Link encap:Ethernet', 'bond3 Link encap:Ethernet', 'bond5:0 Link encap:Ethernet', 'bond1.5:2 Link encap:Ethernet', 'bond2.6 Link encap:Ethernet' ); print join "\n", grep ! /^[\w.]+:/, @arry;
    A user level that continues to overstate my experience :-))

      Where's the last newline? ;-)

        Where's the last newline? ;-)
        Let the OP put it thus :)
        print join ("\n", grep ! /^[\w.]+:/, @arry),$/;

        If you tell me, I'll forget.
        If you show me, I'll remember.
        if you involve me, I'll understand.
        --- Author unknown to me
Re: $1 does not reset to undef
by ww (Bishop) on Oct 25, 2013 at 12:27 UTC

    While the initial responses offer valuable suggestions on the reset issue, I believe the authors (update+correction: Blooknok excepted) mis-read the question.

    OP asks "to select lines which do not have : at the first word."

    I read first word (in this context and OP's data sample) as the characters prior to the first space.

    Hence:

    #!/usr/bin/perl use 5.016; use warnings; # 1059623 # select lines which do not have : at the first word. my @arry=( 'bond0.2 Link encap:Ethernet', 'bond4.3:6 Link encap:Ethernet', 'bond3 Link encap:Ethernet', 'bond5:0 Link encap:Ethernet', 'bond1.5:2 Link encap:Ethernet', 'bond2.6 Link encap:Ethernet' ); my $elem; for $elem(@arry) { if($elem =~ /(bond[^:]+?)\s+Link.*$/) { # note negated char cl +ass, minimally my $match = $1; # You may find it 'goo +d practice' to extract # any value in $1 to a +nother var ASAP say $match . " The colon, if any, is AFTER the first w +ord \n\tin | \"$elem\" |"; } else { say "Matching colon in first word (ie, before a space) +\n\t in | \"$elem\" |"; } } =head C:\>1059623.pl bond0.2 The colon, if any, is AFTER the first word in | "bond0.2 Link encap:Ethernet" | Fails OP's criterion; matching colon in first word (ie, before a space +) in | "bond4.3:6 Link encap:Ethernet" | bond3 The colon, if any, is AFTER the first word in | "bond3 Link encap:Ethernet" | Fails OP's criterion; matching colon in first word (ie, before a space +) in | "bond5:0 Link encap:Ethernet" | Fails OP's criterion; matching colon in first word (ie, before a space +) in | "bond1.5:2 Link encap:Ethernet" | bond2.6 The colon, if any, is AFTER the first word in | "bond2.6 Link encap:Ethernet" | C:\> =cut
      As indeed I did ww, the only major differences are the minimised character class you used - which I may have arrived at myself - and the reporting. Either way, the nett result is the same since the three non-multi-homed ports are listed by both your & my posited solutions.

      A user level that continues to overstate my experience :-))
        Sorry. After a more careful read, I have posted a correction (and herewith, offer an apology for the fact that my sloppy read led me to impugn your post).

      Hi ww,

      I don't know whether I understand you right. I understood the question the following: From this typical first line of an ifconfig output, the OP wants all entries which are NOT aliased entries. When I let run this script:

      #!/usr/bin/env perl use strict; use warnings; use 5.010; use Data::Dumper; my @arry = ( 'bond0.2 Link encap:Ethernet', 'bond4.3:6 Link encap:Ethernet', 'bond3 Link encap:Ethernet', 'bond5:0 Link encap:Ethernet', 'bond1.5:2 Link encap:Ethernet', 'bond2.6 Link encap:Ethernet' ); foreach (@arry) { if(/^([\w\.]+)\s+Link.*$/) { printf "Array item: %-30s\tmatch: %s\n", $_, $1; } }

      I get all the "non aliased" lines.

      What do you mean is wrong? (I'm pretty sure I can't break the language barrier today.)

      UPDATE: After an off thread talk to ww I understand now that the regex presented by ww and Bloodnok fullfills precisely the formulated pattern matching request of snk. So, besides giving the hint for the right way to react on a match the regex should also be corrected to fullfil the request made, even when the result in this example matches the expectations of snk.

      Regards
      McA

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1059621]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (10)
As of 2014-11-27 12:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (184 votes), past polls