Perl正则表达式和返回的匹配组数组

时间:2013-02-19 18:16:27

标签: perl regex

我是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语句。

3 个答案:

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

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

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