我想要类似......
my $sub = $ARGV[1];
...
@objs = get_all_objects();
for my $obj (@objs) {
// invoke subroutine $sub with param as $obj.
}
现在,如果我说
all_objects.pl "print 'x '"
all_objects.pl "print '$_ '"
我应该
obj1 obj2 obj3 ...
即。命令行arg以某种方式充当子例程。这可以实现吗?
答案 0 :(得分:4)
eval ""
很糟糕。如果满足您的需求,请使用以下内容:
my ($sub) = @ARGV;
my %prepared = (
print => sub { print "$_[0]\n" },
woof => sub { $_[0]->woof },
meow => sub { $_[0]->meow },
);
@objs = get_all_objects();
for my $obj (@objs) {
$prepared{$sub}->($obj);
}
更新:出于调试目的,Perl有一个调试器:perldoc perldebug
答案 1 :(得分:1)
您可以将all_objects.pl
代码放入模块中,然后在命令行中使用该模块:
将其放入AllObjects.pm:
package AllObjects;
use strict;
use warnings;
sub get_all_objects
{
# code here...
}
1;
现在在命令行上:
perl -I. -MAllObjects -wle'for my $obj (AllObjects::get_all_objects()) { print "object is $obj" }'
然而,您在整体设计中尝试实现的目标并不十分清楚。
您可以在perldoc perlrun阅读有关perl命令行调用的更多信息,并在p erldoc perlmod上创建模块(以及Stack Overflow上的许多帖子)。