如何从Perl函数调用返回多个值?

时间:2011-09-09 21:00:04

标签: perl

如何从Perl函数调用中返回多个值?

示例代码

my ($value1, $value2, $value3) = getValues(@parts)

sub getValues
{
    foreach(@_)
    {
        $_ =~ m{/test1_name (.*) test2_name (.*) test3_name (.*)/};

        $test1_value = $1;
        $test2_value = $2;
        $test3_value = $3;
    }
}

此代码无效。

3 个答案:

答案 0 :(得分:18)

my ($value1, $value2, $value3) = getValues(shift @parts);

sub getValues
{
   my $str = shift @_;

   $str =~ m{/test1_name (.*) test2_name (.*) test3_name (.*)/};

   return ($1, $2, $3);
}

如果您只想获得$ 1,$ 2,$ 3,则无需将其置于foreach循环中。 my $str = shift @_;基本上表示“将变量str设置为传递给此子的值中的第一项”。

另外,你传入一个数组。我做了一个转换,因为它从数组中获取第一个值(我假设是你要解析的字符串)。如果你想尝试不同的事情,请更新你的问题,我会更新我的答案。

答案 1 :(得分:6)

除了给出的其他答案之外,您还可以利用以下事实:列表上下文中的正则表达式匹配返回捕获括号,并且所有子例程都返回其最后计算的表达式:

my ($value1, $value2, $value3) = getValues($parts[0]);

sub getValues {
    shift =~ m{/test1_name (.*) test2_name (.*) test3_name (.*)/}
}

由于该子程序非常简单,您也可以这样写:

my $getValues = qr{/test1_name (.*) test2_name (.*) test3_name (.*)/};

my ($value1, $value2, $value3) = $parts[0] =~ $getValues;

答案 2 :(得分:1)

Perl习惯用法是返回列表中的多个值,然后将函数的结果分配给要接收值的变量列表。您已经正确分配了该功能的结果,因此您需要的唯一更改是return ($1, $2, $3);,正如大家所建议的那样。