2

我是 Perl 的新手,我需要做一些正则表达式。我读到,当数组像整数值一样使用时,它会给出内部元素的计数。

所以我正在做例如

if (@result = $pattern =~ /(\d)\.(\d)/) {....}

我在想它应该在模式匹配失败时返回空数组,但它仍然给我一个包含 2 个元素的数组,但具有未初始化的值。

那么我如何将模式匹配放入 if 条件中,这可能吗?

编辑:

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;
    }

}

它是命令行选项的正则表达式模式,cmd 选项是长格式,前面有两个连字符,并且可能带有参数,所以 --CMD[=ARG]。我想要优雅的解决方案,所以这就是为什么我想把它放在没有一些序言等的 if 条件下。

EDIT2:哦,对不起,我在想@result 数组中的组总是从 0 开始计数,但只有来自分支的组才能访问,其中模式是成功的。因此,如果在我的代码命令中是“输入”,它应该在 $result[0] 中,但实际上它在 $result[1] 中。我想如果 $result[0] 未初始化,那么模式会失败,它会转到 if 语句。

4

3 回答 3

3

考虑以下:

use strict;
use warnings;

my $pattern = 42.42;

my @result = $pattern =~ /(\d)\.(\d)/;

print @result, ' elements';

输出:

24 elements

上下文告诉 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当且仅当匹配成功时计算。

于 2013-02-19T18:57:03.913 回答
2
@results = $pattern =~ /(\d)\.(\d)/ ? ($1,$2) : ();
于 2013-02-19T18:57:27.057 回答
1

试试这个:

@result = ();
if ($pattern =~ /(\d)\.(\d)/)
{
 push @result, $1;
 push @result, $2;
}

=~ 不是等号。它正在进行正则表达式比较。

所以我上面的代码是将数组初始化为空,然后仅在正则表达式匹配时才分配值。

于 2013-02-19T18:40:23.880 回答