2

同様の質問があります Perl でサブルーチン呼び出しの結果を配列参照に割り当てるにはどうすればよいですか? しかし、私はperlの可能性に興味があります

参照の配列を要素単位で直接逆参照する perl のハックはありますか?

のようなコードで

sub test { return([1..4],[5..8]); }
my (@a,@b);
my @result = test();
@a = @{$result[0]}; @b = @{$result[1]};

コードを次のような単純なステートメントに短縮したいと思います

sub test { return([1..4],[5..8]); }
my (\@a,\@b) = test();

またはループで

foreach my $element (\"1",\"2",\"3") {
    my $dereferenced_element = $$element;

のようなものを書くとよいでしょう。

foreach my \$element (\"1",\"2",\"3") {

変数の参照に値を割り当てたくないので、この構文はあまり意味がないことを知っていますが、逆参照された値を変数自体に割り当てますが、
その中に何かがあるかどうか知りたいですperl のレパートリーの方向性であり、この例は私がやろうとしていることを最もよく示していると思います

4

4 に答える 4

3

必要に応じて地球儀を直接変更できますが、これはお勧めできません。

sub test { return [1..3], [2..4]; }
(*x, *y) = test;
print "@x and @y";

出力:

1 2 3 and 2 3 4

myこれは字句 ( ) 変数では機能しません。で動作させるには、 (の代わりに)strictを使用して変数を宣言できます。ourmy

于 2012-03-26T08:47:00.110 に答える
2

これは、直接の逆参照に関する質問への回答ではありませんが、

あなたがしていること:

sub test { return([1..4],[5..8]); }
my (@a,@b);
my @result = test();
@a = $result[0]; @b = $result[1];

@a および @b 配列は、この後 2 次元配列になります。

代わりに、次のように言う必要があります。

@a = @{$result[0]};
@b = @{$result[1]};

または、おそらくすでにご存知のように:

my ($a, $b) = test();

また:

for my $element (test()) {
     # $element is an array ref
}
于 2012-03-26T08:54:20.703 に答える
1

@Qtaxの答えはきちんとしています。他にできることはないかと考えていました。あなたが求めたものとは正確には異なりますが、近いです。

sub test { return [1..3], [2..4]; }

my (%a);

@a{'ret1','ret2'} = test();

print @{$a{'ret1'}} ;
print @{$a{'ret2'}} ;
于 2012-03-26T11:12:06.257 に答える
0

最善の方法、IMO は、配列参照をスカラー変数に割り当て、必要に応じてそれらを逆参照することです。

my ($x, $y) = test();

my @arrayx = @$x;
my @arrayy = @$y;

print "Element 1 in \$x is: $x->[1]\n";
for my $element (@$x) { ... }

$aまた、変数としてandを使用することは悪い考えであることに注意してください。これらは、ルーチン$bによって使用される事前定義されたグローバル変数であるためです。sortほとんどの定義済み変数と同様に使用できますが、奇妙な動作や見つけにくいバグにつながる可能性があります。

于 2012-03-26T12:36:57.993 に答える