2012-03-21 9 views
11

は、Perlサブルーチンが配列を返すと言う:私は、このことから、特定の配列要素にアクセスする最初のを言うPerlサブルーチンによって返された要素に選択的にアクセスするにはどうすればよいですか?

sub arrayoutput 
{ 
    ...some code... 
    return @somearray; 
} 

。だから私はできます:

@temparray=arrayoutput(argument); 

そして次に$temparray[0]を参照してください。

しかし、この種の短い参照は機能しません:$arrayoutput(some argument)[0]

私はPythonに慣れていてPerlには慣れているので、この値を得るには、短く直感的なpython風の方法(a=arrayoutput(some argument)[0])を探しています。私のPerlプログラムは非常に長くなり、そのような一時的な配列を使用すると醜いようです。 Perlにこれを行う方法はありますか?

答えて

10

Slices

use warnings; 
use strict; 

sub foo { 
    return 'a' .. 'z' 
} 

my $y = (foo())[3]; 
print "$y\n"; 

__END__ 

d 

UPDATE:別のコード例あなたのコメントに対処します。あなたは中間変数を必要としません:

use warnings; 
use strict; 

sub foo { 
    return 'a' .. 'z' 
} 

print((foo())[7], "\n"); 

if ((foo())[7] eq 'h') { 
    print "I got an h\n"; 
} 

__END__ 

h 
I got an h 
+0

+1、これは動作します。しかし、再び値にアクセスするために中間変数を作成する必要があります。しかし、これは一歩進んでいます。なぜなら、とにかく変数の割り当てが必要なときには、少なくともそれを使うことができるからです。しかし、他のシナリオでは、 'print(foo())[3]'ステートメントや 'if((foo())[3] ...)'ステートメントは言いません。 –

+0

あなたはその両方を行うことができます。私の更新された回答を見てください。 – toolic

+2

'print(foo())[7]'は期待通りに動作しません。なぜなら、perlはカッコが関数呼び出しに属していると仮定して '(print foo())[7] '。しかし、 'print((foo())[7])'やもっとイディオム的に 'print +(foo())[7]'のどちらかが機能します。 –

2

片道は[(arrayoutput(some argument))]->[0]である可能性があります。

+0

+1です。私はなぜこれが下落されているのか分かりません。私は行方不明のいくつかのプログラミングの練習が悪いですか? –

+1

配列参照を使用する必要はありません。私はそれが下降の理由だと思う。 –

14

はリストコンテキストを介して、第1引数をやってのける:スライスと

my ($wanted) = array_returning_sub(@args); 

TIMTOWTDI:

my $wanted = (array_returning_sub(@args))[0]; 

を両方のスタイルができリストのスライスが目の上で少し楽になりますが、返される配列のn番目の要素を抽出するように拡張してください:

my (undef, undef, $wanted, undef, $needed) = array_returning_sub(@args); 

my ($wanted, $needed) = (array_returning_sub(@args))[2,4]; 
+0

''配列を返すサブ ''として読み込み、 ''配列を返す配列 ''を返します。 – Zaid

+1

サブ配列は配列を返すことができません。彼らはスカラーのリストだけを返すことができます。 – ikegami

+0

+1。だからそれは単なる括弧の問題でした!リストスライスは、長いリストのためのリストコンテキストよりも優れています。 –

関連する問題