2009-07-21 34 views
3

私はPerlに問題があります。わかりません。私はこの非常に短いコードを削除しました。マップが空の配列を返すのはなぜですか?

なぜPerlのmap関数が空の配列を返すのですか? 9 undefの配列を返してはいけませんか?

sub mySub{ 
    return; 
} 

my @arr = (1 .. 9); 
my @arr2 = map(mySub($_), @arr); 

print @arr . ' ' . @arr2, "\n"; 

「9 0」が印刷されます。

これはおそらく単純なものですが、perldocは役に立ちません。

+0

@arr =(1..9); –

答えて

8

あなたの質問に対するより一般的な答えは、次のとおりです。引数なしでreturnを使用すると、呼び出しコンテキスト:たとえば

list context returns an empty list 
scalar context returns an undefined value 

use strict; 
use warnings; 
use Data::Dumper; 

my (@list); 
sub mySub { return } 
@list = map(  mySub($_), 1..2); print Dumper(\@list); 
@list = map(scalar mySub($_), 1..2); print Dumper(\@list); 

出力:

$VAR1 = []; 
$VAR1 = [ 
      undef, 
      undef 
     ]; 
+0

ありがとう....キャッチは、私はマップがリストのコンテキストでそれを呼び出すのか分からなかったです。 (このスカラー/リストコンテキストのコンセプトは、今でも私をperlで混乱させます:)) –

7

サブルーチンはではありません。はundefを返し、空のリストを返します。 9回、空のリストはまだ空のリストです。

明示的にundefを返すようにしてください。出力は異なります。

+0

いいえ、9個の空リストのリストが表示されます。 – jiggy

+0

はい、ありがとうございます。 –

+1

jiggy:私はあなたがperlのリストのリストを持つことはできないと思います。 Perlリストはすべて「フラット」と「1次元」です。 –

3

あなたがundefsをを含むリストを取得する必要がある場合は、明示的にundefをを返す必要がこの

use strict; 
use warnings; 

sub mySub{ 
    return undef; 
} 

my @arr = (1,2,3,4,5,6,7,8,9); 
my @arr2 = map(&mySub, @arr); 

print @arr." "[email protected]; 

を試してみてください。そのことは、mapがmySubを配列コンテキストで呼び出すことです(wantarrayがこのサブからどのようなものかを確認します)。 returnステートメントは、サブが呼び出されるたびに空のリストを返すので、結果として配列が空になります

+0

nononoのおかげで、私のコードは何もしなかったばかげた例でした。私はあなたが説明したことをしたくない、私は9 undefsとリストを持っていたかった。しかし、とにかくありがとう –

+2

これはなぜdownmoddedですか?これはここで最も賢明な答えです。 – jrockway

関連する問題