我有一个像
这样的功能sub multi_return {
my ($val1, $val2) = ('','');
#does something
return ($val1, $val2);
}
有没有办法可以将两个返回的vales与不同的字符串变量连接起来而不必使用临时变量?
my $string1 = 'some text';
my $string2 = 'some other text';
my ($tmp1,tmp2) = multi_return();
$string1 .= $tmp1;
$string2 .= $tmp2
undef($tmp1);
undef($tmp2);
这不起作用
($string1, $string2) = multi_return();
修改
更一般地说,我正在寻找一种连接两个字符串列表的方法,其中两个列表具有相同的长度。应该连接每个列表相同位置的字符串。
我想@ amon答案的第二部分符合我的目的。
答案 0 :(得分:4)
你问的一般是不可能的。但是,我们可以做一些循环来抽象返回值的数量:
my @strings = ("some text", "some other text");
my @ret = multi_return;
$strings[$_] .= $ret[$_] for 0 .. $#strings;
我们可以写一个副本,然后反过来抽象:
sub append_all {
my $suffixes = shift;
$_ .= shift @$suffixes for @_; # uses aliasing behaviour to modify out-args
}
my $string1 = "some text";
my $string2 = "some other text";
append_all([multi_return()] => $string1, $string2);
答案 1 :(得分:2)
我认为你是在思考这个问题。为什么不直接将字符串传递给子例程,在内部连接,然后为它们分配返回值?像这样:
my $str1 = "foo";
my $str2 = "bar";
my @args = qw(something else you need);
($str1, $str2) = multi_return($str1, $str2, @args);
# $str1 == "foosomething";
# $str2 == "barsomething else"
sub multi_return {
my ($str1, $str2, @args) = @_;
$str1 .= "something";
$str2 .= "something else";
.... # etc
return ($str1, $str2);
}
相关说明,您的代码:
my $string1 = 'some text';
my $string2 = 'some other text';
my ($tmp1,tmp2) = multi_return();
$string1 .= $tmp1;
$string2 .= $tmp2
undef($tmp1);
undef($tmp2);
写得更好:
my $string1 = 'some text';
my $string2 = 'some other text';
{
my ($tmp1, $tmp2) = multi_return();
$string1 .= $tmp1;
$string2 .= $tmp2;
}
词汇变量仅限于定义它们的范围,在本例中是我们围绕它的周围块。使用您的代码,变量$tmp1
和$tmp2
仍然在范围内,它们可能会搞乱。
答案 2 :(得分:-2)
您可以在块中声明临时变量,以便它们不可用于代码块的其余部分
my $string1 = 'some text';
my $string2 = 'some other text';
{
my ($tmp1,tmp2) = multi_return();
$string1 .= $tmp1;
$string2 .= $tmp2
}