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

編集:

より一般的には、両方のリストの長さが同じである 2 つの文字列リストを連結する方法を探しています。各リストの同じ位置にある文字列は連結する必要があります。

@amonの回答の2番目の部分が私の目的を果たしていると思います。

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 に答える