2013-06-20 21 views
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的答案的第二部分服务于我的目的。

+2

也许你能解释一下你正在试图达到什么块的其余部分?我的意思是:什么是串联?也许而不是这样做,传递字符串来使函数返回已经连接的元素? – 2013-06-20 10:51:01

+0

将字符串传递给函数不会每次都有效,因为有时候我需要使用这个函数来处理系统函数。 – Pit

回答

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

使用数组(特别是'字符串'部分')并不真正帮助我,因为我不能使用具有自解释名称的变量 – Pit

+0

我添加了另一个抽象层次,可以做你想做的事。 – amon

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仍然在范围内,他们可能会搞砸了。

+0

你的答案的第一部分与@amon的第二部分有某种相同之处。 – Pit

+0

@Pit你是在指责我剽窃阿蒙的答案吗?它们在功能上是相似的,因为那是你所要求的功能。他们在实施方面有很大的不同,我的国际海事组织更具可读性,而阿蒙更灵活。 – TLP

-2

你可以在一个块中声明的临时变量,使它们不提供给代码

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

请告诉我这与TLP的答案不一样。与他最后一个代码示例相比,唯一的区别是一个空格,一个'$'和一个分号。 – amon

+0

@amon还有一个缺失的美元符号。 :) – TLP

+0

@amon TLP和我几乎在同一时间回答。我很抱歉,如果TLP第一次回答,我错过了他们写的东西。至于缺失的美元,在原始问题和TLP的副本中缺少。 – AdrianHHH