1

我有一个像

sub multi_return {
    my ($val1, $val2) = ('','');
    #does something
    return ($val1, $val2);
}

有没有一种方法可以将两个返回的值与不同的字符串变量连接起来,而不必使用临时变量?

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

4

3 回答 3

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);
于 2013-06-20T10:14:04.473 回答
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仍然在范围内,它们可能会搞砸。

于 2013-06-20T11:50:06.610 回答
-2

您可以在块中声明临时变量,以便它们对代码块的其余部分不可用

my $string1 = 'some text';
my $string2 = 'some other text';
{
    my ($tmp1,tmp2) = multi_return();
    $string1 .= $tmp1;
    $string2 .= $tmp2
}
于 2013-06-20T12:26:42.837 回答