在Perl中将带有参数的子例程推入堆栈

在Perl中将带有参数的子例程推入堆栈,perl,subroutine,perl-data-structures,Perl,Subroutine,Perl Data Structures,我想将带有参数的子例程推送到堆栈中,但我无法理解其语法。考虑一个没有参数的工作例子: 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, $EN

我想将带有参数的子例程推送到堆栈中,但我无法理解其语法。考虑一个没有参数的工作例子:

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 );
}
#/usr/bin/perl-w
严格使用;
使用警告;
子hi{打印“hi\n”;}
子hello{打印“hello\n”;}
子世界{打印“世界”\n;}
我的@stack;
推送(@stack,\&hi);
推送(@stack,\&hello);
推送(@stack,\&world);
while(@stack){
我的$proc=pop@stack;
$proc->();
}
当我运行代码时:

%./pop-proc.pl
世界
你好
你好
现在我的问题是,如果子程序是这样的:

sub-mysub
{
chomp(my($arg)=@;
打印“$arg\n”;
}
我想推送带有参数的子程序,例如:

mysub(“你好”);
mysub(“世界”);
非常感谢您的意见。

使用匿名sub(甚至可能是闭包)

比如说,

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

我可以这样做,创建一个元组来保存代码引用及其参数:

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,但那是因为我无法控制自己。这也行,但现在我觉得很难看:

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

&$proc
的意思是非常特殊的东西。您的意思是使用
&$proc()
或更清晰的
$proc->()
。谢谢@ikegami。我已根据您的建议修改了示例代码,以使用
$proc->()
替换
使用v5.24
一起使用功能qw(postderef);#5.20+
无警告qw(实验性::postderef)#从5.24开始不再进行实验,您的代码将在5.20中运行+