在 Perl 中将带有参数的子例程推入堆栈
Push a subroutine with argument into a stack in 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";
}
并且我想推送带参数的子例程,例如:
mysub("hello");
mysub("world");
非常感谢您的意见。
使用匿名子(甚至可以是闭包)。
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
我可能会做这样的事情,我创建一个元组来保存代码引用及其参数:
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 ) };
我想将带有参数 的子例程压入堆栈,但我无法理解语法。考虑一个没有参数的工作示例:
#!/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";
}
并且我想推送带参数的子例程,例如:
mysub("hello");
mysub("world");
非常感谢您的意见。
使用匿名子(甚至可以是闭包)。
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
我可能会做这样的事情,我创建一个元组来保存代码引用及其参数:
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 ) };