将多个正则表达式匹配中的一个分配给变量为Perl one-liner(dereference array?)

时间:2013-10-18 09:55:37

标签: regex arrays perl

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

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

我也知道我可以将regex匹配作为命名数组,然后为变量分配一个匹配:

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中实现正则表达式匹配数组的单行分配?

2 个答案:

答案 0 :(得分: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";'

答案 1 :(得分:2)

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

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

我在这里使用undef作为占位符,但您也可以使用其他变量。这种方法只是丢弃第一场比赛。基本上,左侧的标量按照它们出现的顺序从右侧分配值。像这样:

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

此处的作业将产生:$one == 1$two == 2$three == 34被丢弃。