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

Bru*_*ker 6 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码无效.

Dav*_*ave 19

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

sub getValues
{
   my $str = shift @_;

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

   return ($1, $2, $3);
}
Run Code Online (Sandbox Code Playgroud)

如果你只想获得$ 1,$ 2,$ 3,你不需要把它放在foreach循环中.该my $str = shift @_;基本上说"变量str设置为传递到此子值中的第一项".

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


Eri*_*rom 6

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

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

sub getValues {
    shift =~ m{/test1_name (.*) test2_name (.*) test3_name (.*)/}
}
Run Code Online (Sandbox Code Playgroud)

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

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

my ($value1, $value2, $value3) = $parts[0] =~ $getValues;
Run Code Online (Sandbox Code Playgroud)