• 締切済み

sortをscalarで評価すると

@st=qw(az b cz); print scalar(sort(@st)); print scalar(grep /../,@st); print scalar(map {$_.'z'} @st); 出力結果が 2 3 なのですがgrepやmapがリストの要素数を出力しているのに なぜsortだけが要素数を出力しないのかがわかりません。

みんなの回答

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

そういう「仕様」だからです。 perl の関数は、 scalar と list のどちらで評価されているかによって、返す値を変えることができます。 例えば、localtime 関数は、list context だと日時を配列で返しますが、 scalar context だとフォーマットを整えた文字列を返します。 print join(',',localtime). "\n"; print scalar(localtime)."\n"; map や grep は、「list context の時は結果のリストを返す」「scalar context の時は、結果の要素の数を返す」という仕様になってます。 (これは、配列を scalar context で評価した場合と同じ挙動です) ですが、sort 関数は「list context の時はソートしたリストを返す」「scalar context の時は何を返すかは未定義」という仕様になっているのです。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

sort - perldoc.perl.org http://perldoc.perl.org/functions/sort.html に > In scalar context, the behaviour of sort() is undefined. って書いてあるので未定義なんでしょう。

関連するQ&A