如何执行命令行中指定的Perl代码?

时间:2010-02-24 12:00:47

标签: perl

我想要类似......

all_objects.pl

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以某种方式充当子例程。这可以实现吗?

2 个答案:

答案 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)

除非你真的知道自己在做什么,否则Eval就是邪恶的(想想它是一个无法保护的热核武器 - 如果你不得不这样做,你肯定可以处理它,它甚至可以拯救世界,但你会更好离开它作为最后的手段,并让核物理学家处理它。)

您可以将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上的许多帖子)。