16

のように、関数の結果を並べ替えようとしていましたsort func();が、何も返されなかったため、やけどを負いました。Perl は、関数呼び出しがソート ルーチンの後にデータがないと考えたのでしょう。

Perldoc によると、2 番目のパラメータはサブルーチン名またはコード ブロックにすることができます。私は func() を名前ではなく呼び出しと見なしています。これはDWIMMYではないと思います。

これがどのように機能するかをさらに調べるために、私はこれを書きました:

use strict;
use warnings;

sub func {
    return qw/ c b a /;
}

my @a;

@a = sort func();
print "1. sort func():    @a\n"; 

@a = sort &func;
print "2. sort &func:     @a\n"; 

@a = sort +func();
print "3. sort +func():   @a\n"; 

@a = sort (func());
print "4. sort (func()):  @a\n"; 

@a = sort func;
print "5. sort func:      @a\n"; 

出力、警告は生成されませんでした:

1. sort func():
2. sort &func:     a b c
3. sort +func():   a b c
4. sort (func()):  a b c
5. sort func:      func

番号 1 は、私が得た動作です。出力はありません。

2 は機能するのに 1 は機能しないことに驚いています。私はそれらが同等であると思いました。

私は 3 と 4 を理解しています。問題を解決するために 4 を使用しました。

特に警告がなかったことを考えると、5 で本当に混乱しています。

1 と 2 の違いと、5 が関数の名前を出力する理由を誰かが説明できますか?

4

2 に答える 2

13

sort func()として解析しますsort func ()。つまり、空のリスト [ ()] をルーチンでソートしますfunc

そして #5 として解析しsort ("func")、(ベアワード) string を含むリストをソートしますfunc。多分これについて警告があるはずですが、ありません。


デパーサー出力:

$ perl -MO=Deparse -e '@a1 = sort func();' -e '@a2=sort &func;' \
    -e '@a3=sort +func();' -e '@a4=sort (func());' -e '@a5=sort func;'
@a1 = (sort func ());
@a2 = sort(&func);
@a3 = sort(func());
@a4 = sort(func());
@a5 = sort('func');
-e syntax OK
于 2013-06-26T14:34:54.060 に答える
11

関数呼び出しの戻り値をソートする方法を正確に示す perldoc のセクションがあります: http://perldoc.perl.org/functions/sort.html

警告: 関数から返されたリストをソートするときは、構文上の注意が必要です。関数呼び出し find_records(@key) によって返されたリストを並べ替えたい場合は、次を使用できます。

@contact = sort { $a cmp $b } find_records @key;
@contact = sort +find_records(@key);
@contact = sort &find_records(@key);
@contact = sort(find_records(@key));

したがって、あなたの場合、次のことができます:

@a = sort( func() );
于 2013-06-26T14:39:06.650 に答える