1

我已经知道我可以一次性打印所有正则表达式匹配项(尽管没有分隔符),如下所示:

perl -e '$t="10 hello 25 moo 31 foo"; print ( $t =~ /(\d+)/g ) ; print "\n";'
# 102531

我也知道我可以将正则表达式匹配作为命名数组,然后将单个匹配分配给变量:

perl -e '$t="10 hello 25 moo 31 foo"; @n=( $t =~ /(\d+)/g ); $o=$n[1]; print "$o\n";'
# 25

我也知道我可以做正则表达式,然后参考,比如说$1

perl -e '$t="10 hello 25 moo 31 foo"; $t =~ /(\d+)/g ; $o=$1; print "$o\n";'
# 10

...虽然,由于某种原因,$2在这里不起作用 - 为什么?

我想做的是一次性/单行将正则表达式中的特定匹配分配给变量(不使用命名数组)。由于上面告诉我们正则表达式匹配的结果是一个数组,我认为像这样的成语(与取消引用数组一起使用?)会起作用:

$o = @{ ( $t =~ /(\d+)/g ) }[1];

但不幸的是它没有:

perl -e '$t="10 hello 25 moo 31 foo"; $o=@{ ( $t =~ /(\d+)/g ) }[1]; print "$o\n";'
#

那么,有没有办法在 Perl 中实现正则表达式匹配数组的单行赋值?

4

2 回答 2

3

只需更改此:

perl -e '$t="10 hello 25 moo 31 foo"; $o=@{ ( $t =~ /(\d+)/g ) }[1]; print "$o\n";'

至:

perl -e '$t="10 hello 25 moo 31 foo"; $o=( $t =~ /(\d+)/g )[1]; print "$o\n";'
于 2013-10-18T10:03:58.067 回答
2

除了 M42 在列表上使用下标的方法外,还可以使用直接赋值

my (undef, $x) = $t =~ /\d+/g;

undef在这里用作占位符,但您也可以使用另一个变量。此方法只是丢弃第一个匹配项。基本上,左侧的标量按照它们出现的顺序从右侧分配值。像这样:

my ($one, $two, $three) = (1, 2, 3, 4);

这里的赋值将导致$one == 1$two == 2$three == 34被丢弃。

于 2013-10-18T13:47:30.473 回答