如何从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;
}
}
此代码无效。
答案 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);
,正如大家所建议的那样。