将多个正则表达式匹配之一分配给变量作为 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 == 34 被丢弃。

【讨论】:

以上是关于将多个正则表达式匹配之一分配给变量作为 Perl 单行(取消引用数组?)的主要内容,如果未能解决你的问题,请参考以下文章

Perl正则表达式匹配多行文件与匹配变量如何处理换行

Perl - 正则表达式匹配的输出非常奇怪,确实

PHP -- Perl风格正则表达式

perl多个正则表达式匹配多行

perl正则表达式

Perl正则表达式选项存储在变量中[重复]