将多个正则表达式匹配之一分配给变量作为 Perl 单行(取消引用数组?)
Posted
技术标签:
【中文标题】将多个正则表达式匹配之一分配给变量作为 Perl 单行(取消引用数组?)【英文标题】:Assign one of multiple regex matches to variable as Perl one-liner (dereference array?) 【发布时间】:2013-10-18 09:55:36 【问题描述】:我已经知道我可以像这样一次性打印所有正则表达式匹配项(尽管没有分隔符):
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 中实现这样的正则表达式匹配数组的单行赋值?
【问题讨论】:
【参考方案1】:只要改变这个:
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";'
【讨论】:
非常感谢 @M42 - 不敢相信我差点找到它,却错过了:)
干杯!【参考方案2】:
除了M42对列表使用下标的方法外,还可以使用直接赋值
my (undef, $x) = $t =~ /\d+/g;
我在这里使用undef
作为占位符,但您也可以使用其他变量。此方法只是丢弃第一个匹配项。基本上,左侧的标量按照它们出现的顺序从右侧分配值。像这样:
my ($one, $two, $three) = (1, 2, 3, 4);
这里的分配将导致:$one == 1
、$two == 2
和 $three == 3
。 4
被丢弃。
【讨论】:
以上是关于将多个正则表达式匹配之一分配给变量作为 Perl 单行(取消引用数组?)的主要内容,如果未能解决你的问题,请参考以下文章