我已经知道我可以一次打印所有正则表达式匹配(虽然没有分隔符),如下所示:
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中实现正则表达式匹配数组的单行分配?
答案 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 == 3
。 4
被丢弃。