in reply to $1 does not reset to undef

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

Replies are listed 'Best First'.
Re^2: $1 does not reset to undef
by McA (Priest) on Oct 25, 2013 at 13:31 UTC

    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

Re^2: $1 does not reset to undef
by Bloodnok (Vicar) on Oct 25, 2013 at 12:54 UTC
    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).