我是Perl的新手,我需要做一些正则表达式。 我读过,当数组像整数值一样使用时,它会给出里面元素的数量。
所以我在做例如
if (@result = $pattern =~ /(\d)\.(\d)/) {....}
并且我认为它应该返回空数组,当模式匹配失败时,但它仍然给我带有2个元素的数组,但是没有初始化的值。
那么如果条件允许我可以在里面放置模式匹配,是否可能?
编辑:
foreach (keys @ARGV) {
if (my @result = $ARGV[$_] =~ /^--(?:(help|br)|(?:(input|output|format)=(.+)))$/) {
if (defined $params{$result[0]}) {
print STDERR "Cmd option error\n";
}
$params{$result[0]} = (defined $result[1] ? $result[1] : 1);
}
else {
print STDERR "Cmd option error\n";
exit ERROR_CMD;
}
}
它是命令行选项的regexp模式,cmd选项是长格式,前面有两个连字符,可能带参数,所以 --cmd [= ARG]。我想要优雅的解决方案,所以这就是为什么我想把它放在条件没有一些prolog等。
EDIT2: 哦,sry,我认为@result数组中的组总是从0开始计算,但是可访问只是来自分支的组,其中模式是成功的。因此,如果我的代码命令是“输入”,它应该在$ result [0]中,但实际上它在$ result [1]中。我想如果$ result [0]未初始化,则模式失败并转到if语句。
答案 0 :(得分:3)
请考虑以下事项:
use strict;
use warnings;
my $pattern = 42.42;
my @result = $pattern =~ /(\d)\.(\d)/;
print @result, ' elements';
输出:
24 elements
Context告诉Perl如何对待@result
。肯定没有24个元素! Perl打印了正则表达式捕获产生的阵列元素。但是,如果我们执行以下操作:
print 0 + @result, ' elements';
我们得到:
2 elements
在后一种情况下,Perl解释@result
的标量上下文,因此将元素数添加到0
。这也可以通过scalar @results
实现。
编辑以适应修改过的帖子:因此,代码中的条件:
if(my @result = $ARGV[$_] =~ /^--(?:(help|br)|(?:(input|output|format)=(.+)))$/) { ...
当且仅当匹配成功时,评估为true
。
答案 1 :(得分:2)
@results = $pattern =~ /(\d)\.(\d)/ ? ($1,$2) : ();
答案 2 :(得分:1)
试试这个:
@result = ();
if ($pattern =~ /(\d)\.(\d)/)
{
push @result, $1;
push @result, $2;
}
=〜不是等号。它正在进行正则表达式比较。
所以我上面的代码是将数组初始化为空,然后仅在正则表达式匹配时才分配值。