2017-07-04 112 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->(); 
} 

,當我運行代碼:

% ./pop-proc.pl 
world 
hello 
hi 

現在的問題是,如果子程序是什麼樣子的:

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

和我'd喜歡用參數推子程序,例如:

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

我可能會做這樣的事情,我創建一個元組舉行碼參考和它的參數:

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); 
} 

我用的是v5.24那裏有postfix dereference,但是那是因爲我不能幫助自己。這也適用,但現在我認爲它很醜陋:

my($proc, @args) = @{ pop(@stack) }; 
+0

非常酷。謝謝!! –

+2

用'use feature qw(postderef)替換'use v5.24;'; #5.20 +'和'沒有警告qw(experimental :: postderef); #不再是5.24'的實驗,你的代碼將運行在5.20+以上 – ikegami