我有一个子程序,它将字符串中的位置作为输入,并且应该返回在该位置找到的单词。例如:
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
是存储在另一个变量中的值。)
答案 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";