Perl 将函数返回的多个值与多个变量连接起来,而不使用临时变量

Perl 将函数返回的多个值与多个变量连接起来,而不使用临时变量,perl,function,concatenation,Perl,Function,Concatenation,我有一个函数 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

我有一个函数

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

你所问的通常是不可能的。但是,我们可以执行一些循环来抽象返回值的数量:

my @strings = ("some text", "some other text");
my @ret = multi_return;
$strings[$_] .= $ret[$_] for 0 .. $#strings;
我们可以写一个sub,然后对其进行摘要:

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);

你的要求通常是不可能的。但是,我们可以执行一些循环来抽象返回值的数量:

my @strings = ("some text", "some other text");
my @ret = multi_return;
$strings[$_] .= $ret[$_] for 0 .. $#strings;
我们可以写一个sub,然后对其进行摘要:

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);

我觉得你想得太多了。为什么不将字符串传递给子例程,在内部串联,然后为它们指定返回值呢?像这样:

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
仍然在范围内,它们可能会把事情搞砸。

我认为您考虑得太多了。为什么不将字符串传递给子例程,在内部串联,然后为它们指定返回值呢?像这样:

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
仍在作用域内,它们可能会把事情搞砸。

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

my $string1 = 'some text';
my $string2 = 'some other text';
{
    my ($tmp1,tmp2) = multi_return();
    $string1 .= $tmp1;
    $string2 .= $tmp2
}

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

my $string1 = 'some text';
my $string2 = 'some other text';
{
    my ($tmp1,tmp2) = multi_return();
    $string1 .= $tmp1;
    $string2 .= $tmp2
}

使用数组(特别是“字符串”部分)并没有真正帮助我,因为我不能使用具有自我解释名称的变量。我添加了另一个抽象级别,可以实现您想要的功能。使用数组(特别是“字符串”部分)并没有真正帮助我,由于我不能使用具有自我解释名称的变量,我添加了另一个抽象级别,它可能会满足您的需要?我的意思是:连接是为了什么?也许不是这样做,而是将字符串传递给函数并使函数返回已连接的元素?将字符串传递给函数并非每次都有效,因为有时我需要它来处理系统函数。也许您可以解释一下您试图实现的目标?我的意思是:连接是为了什么?也许不是这样做,而是将字符串传递给函数并使函数返回已连接的元素?将字符串传递给函数并非每次都有效,因为有时我需要这个来处理系统功能。你答案的第一部分与@amon的第二部分在某种程度上是相同的。@你是在指责我剽窃amon的答案吗?它们在功能上相似,因为这是您请求的功能。它们在实现上有很大的不同,我的更易读,而阿蒙的更灵活。你答案的第一部分与@amon的第二部分在某种程度上是相同的。@你是在指责我剽窃阿蒙的答案吗?它们在功能上相似,因为这是您请求的功能。它们在实现上有很大的不同,我的更具可读性,而阿蒙的更灵活。请告诉我这与TLP的答案有什么不同。与上一个代码示例相比,唯一的区别是少了一个空格、一个
$
、一个分号。@amon还有一个缺少的美元符号。:)@amon TLP和我差不多同时回答。如果TLP先回答,而我错过了他们写的内容,我道歉。至于丢失的美元,这在原始问题和TLP的副本中都丢失了。请告诉我这与TLP的答案有什么不同。与上一个代码示例相比,唯一的区别是少了一个空格、一个
$
、一个分号。@amon还有一个缺少的美元符号。:)@amon TLP和我差不多同时回答。如果TLP先回答,而我错过了他们写的内容,我道歉。至于丢失的美元,这在原始问题和TLP的副本中都丢失了。