2009-08-05 6 views

答えて

37

ここには、あなたが求めていることを示す完全で実用的なスクリプトがあります。ここで

sub a { print "Hello World!\n"; } 

sub b { 
    my $func = $_[0]; 
    $func->(); 
} 

b(\&a); 

は説明です:あなたは\&aを言うことによって機能aへの参照を取ります。その時点で関数参照があります。通常は関数はfunc()と呼ばれ、関数参照は$func->()

となります。他の参照も同様に扱います。例えば、ここでは配列とハッシュリファレンスを扱うの例です:

sub f { 
    my ($aref, $href) = @_; 
    print "Here's an array reference: $aref->[0]\n"; # prints 5 
    print "Here's a hash ref: $href->{hello}\n";  # prints "world" 
} 

my @a = (5, 6, 7); 
my %h = (hello=>"world", goodbye=>"girl"); 
f(\@a, \%h); 
+1

ハッシュの一部として関数を渡した場合、どうすればこのようになりますか? $ args {function} - >(); – Kys

+0

配列とハッシュリファレンスの例を追加しました。 –

+1

しかし、それはこのだった場合どのような:関数内で、その後 F(ファンクション=> \ &func); 、F、それはこの サブFだろう{ $ argsを{機能} - >(); } – Kys

4

あなたはPerlで\&my_methodとしてサブルーチンの参照にアクセスし、$myref->();でそれらの参照を呼び出すことができます。試してみてください:

perl -e'sub a { print "foo in a"; }; sub b { shift->(); }; b(\&a);' 

幸運を祈る!

+0

もし私がfunctiを渡したらハッシュの一部として、それはこのように見えるでしょうか? $ args {function} - >(); – Kys

2

イーライCourtwrightの例にフォローアップ:あなたは別の関数に関数を渡すことはできません

b(sub { print "Hello World\n"; }); 
5

:あなたは一度だけ最初の関数を使用する場合は、あなたもこのように、無名関数でbを呼び出すことができます直接。代わりに、参照を関数に渡します。関数を呼び出すには、->()を使って逆参照する(CODE refとして)。

sub a { print @_ } 

sub b { 
    my $f = shift; # assuming that $f is a function reference... 
    $f->(@_);  # call it with the remaining arguments 
} 

b(\&a, "hello, world!"); # prints "hello, world!" 

Perlは渡しの名前の意味を持っていませんが、あなたはハッシュを使用してそれらをエミュレートすることができます。関数を呼び出す方法は同じです。あなたはそれを逆参照します。

sub a { print @_ } 

sub b { 
    my %arg = @_; 
    $arg{function}->(@{$arg{arguments}}); 
} 

b(function => \&a, arguments => ["hello, world!"]); 

ObPerl6:Perl 6は、パス名によるセマンティクスを持ちます。

関連する問題