2017-07-04 5 views
3

という引数を持つサブルーチンをスタックにプッシュしたいが、構文を理解できない。引数なしで作業例を考えてみましょう:引数を持つサブルーチンをPerlのスタックにプッシュ

#!/usr/bin/perl -w 
use strict; 
use warnings; 

sub hi { print "hi\n"; } 
sub hello { print "hello\n"; } 
sub world { print "world\n"; } 

my @stack; 
push (@stack, \&hi ); 
push (@stack, \&hello); 
push (@stack, \&world); 

while (@stack) { 
    my $proc = pop @stack; 
    $proc->(); 
} 

私はコードを実行すると:

sub mysub 
{ 
    chomp(my($arg) = @_); 
    print "$arg\n"; 
} 

とI:

% ./pop-proc.pl 
world 
hello 
hi 

を今私の質問は、サブルーチンはこのように見えた場合、何です引数を指定してサブルーチンをプッシュしたいとします。

mysub("hello"); 
mysub("world"); 

入力が高く評価されています。

+1

'&$ proc'は非常に特別なことを意味します。あなたは '&$ proc()'またはより明確な '$ proc - >()'を使用することを意味します。 – ikegami

+0

ありがとう@ikegami。 '$ proc - >()' –

答えて

7

匿名のサブを使用します(クロージャであっても可能です)。例えば

push @stack, sub { mysub("hello") }; 
push @stack, sub { mysub("world") }; 

sub hi { say "@_" } 
my $arg = "Hello"; 
my $sub = sub { hi($arg, @_) }; 
$sub->("World"); # Hello World 
7

私は、コードの参照とその引数を保持するタプルを作成するには、このような何かかもしれません:私はv5.24を使用

use v5.24; 

sub hi { print "Hi @_\n"; } 
sub hello { print "Hello @_\n"; } 

my @stack; 
push @stack, [ \&hi, 'Perl'  ]; 
push @stack, [ \&hello, 'Amelia' ]; 
push @stack, [ \&hello, $ENV{USER} ]; 

while (@stack) { 
    my($proc, @args) = pop(@stack)->@*; 
    $proc->(@args); 
} 

postfix dereferenceがありますが、それは私が自分自身を助けることができないからです。これも動作しますが、今は非常に醜いと思います。

+0

を使ってサンプルコードを修正しました。ありがとうございました!! –

+2

'use v5.24;を' use feature qw(postderef);に置き換えます。 #5.20 + 'と'警告なしqw(experimental :: postderef); #5.24の時点では実験中ではありません。あなたのコードは5.20 + – ikegami

関連する問題