in reply to boundries \b \B

Another way would be to use split.

$ perl -E ' > $data = q{10 1/0/6/0/0.1.20.0.0.2.1 c10t2d1 FA}; > $dev = ( split m{\s+}, $data )[ 2 ]; > say $dev;' c10t2d1 $

I hope this is helpful.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: boundries \b \B
by Marshall (Canon) on Jun 16, 2010 at 01:03 UTC
    I liked JohnGG's split idea. This is a fine way to go when the data is white-space separated.

    I would just point out that it is also possible to specify an index from the end of the array for the list slice. Instead of saying "2" which means skip 0 and 1, you can say -2 which means next to last in the array, [-1] is the last thing in the array (FA). Sometimes this helps if there is a lot of things on the line or if number of things varies. Here 2 and -2 mean the same thing and is just a coincidence.

    If this c,t,d fields are always there, then extracting the digits is easy with match global:

    my $dev = "c10t2d1"; my($c,$t,$d) = $dev =~ m/\d+/g; print "$c $t $d"; #prints: 10 2 1
    If you need a regex, say line can end in other things than FA, then one way is anchor the regex to the end of the line and "work backwards", one way:
    my $test = "10 1/0/6/0/0.1.20.0.0.2.1 c10t2d1 FA "; my ($ctd) = $test =~ m/(\w+)\s+FA\s*$/; print $ctd; #prints: c10t2d1