- 締切済み
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だけが要素数を出力しないのかがわかりません。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mtaka2
- ベストアンサー率73% (867/1179)
そういう「仕様」だからです。 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)
sort - perldoc.perl.org http://perldoc.perl.org/functions/sort.html に > In scalar context, the behaviour of sort() is undefined. って書いてあるので未定義なんでしょう。