函数返回的多个值与多个变量连接而不使用临时变量

时间:2013-06-20 10:09:31

标签: perl function concatenation

我有一个像

这样的功能
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答案的第二部分符合我的目的。

3 个答案:

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