如何获取Perl正则表达式匹配变量的值,索引存储在另一个变量中?

时间:2014-12-04 08:29:33

标签: perl

我有一个子程序,它将字符串中的位置作为输入,并且应该返回在该位置找到的单词。例如:

use warnings;
use strict;

my $num=2;
my $val=getMatch($num);

sub getMatch {
    my ($num)=@_;

    my $str='a b c';
    $str=~ /(\S+)\s(\S+)/;

    my $res;
    eval "$res=\$$num";
    return $res
}

但这会产生错误:

Use of uninitialized value $res in concatenation (.) or string at ./p.pl line 16.

(我正在尝试返回$i,其中i是存储在另一个变量中的值。)

2 个答案:

答案 0 :(得分:3)

我做:

my $num=2;
my $val=getMatch($num);
say $val;
sub getMatch {
    my ($num)=@_;
    my $str='a b c';
    my @res = $str =~ /(\S+)\s(\S+)/;
    return $res[$num-1];
}

<强>输出:

b

答案 1 :(得分:2)

您可以使用perlvar中记录的@+@-特殊变量,如下所示:

sub getMatch {
    my ($num)=@_;

    my $str='a b c';
    $str=~ /(\S+)\s(\S+)/;

    return substr( $str, $-[$num], $+[$num] - $-[$num] );
}
print getMatch(1), "\n";
print getMatch(2), "\n";

或者您可以像这样调整正则表达式:

sub getMatch {
    my $num = shift() - 1;
    my $str='a b c';
    $str=~ /(?:\S+\s){$num}(\S+)/;

    return $1;
}
print getMatch(1), "\n";
print getMatch(2), "\n";

......其优点是只产生一个捕获组。

另一种选择是分割空间:

sub getMatch {
    my ($num)=@_;
    my $str='a b c';
    return ( split /\s/, $str )[$num-1];
}

print getMatch(1), "\n";
print getMatch(2), "\n";

...但是最后一个解决方案对于匹配的内容更加宽容;它没有明确要求两个或多个由空格分隔的非空格项。如果传入3,则会返回&#39; c&#39;。

最后一个产生类似于拆分版本但使用正则表达式的结果。我可能更喜欢拆分,因为它更直接,但我提供这只是为了启发:

sub getMatch {
    my ($num)=@_;
    my $str='a b c';
    return ( $str =~ m/(\S+)(?=\s|$)/g )[$num-1];
}

print getMatch(1), "\n";
print getMatch(2), "\n";