Как я могу выполнить код Perl, указанный в командной строке? - PullRequest
1 голос
/ 24 февраля 2010

Я хочу что-то вроде ..

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 ...

т.е. командная строка в некотором роде действует как подпрограмма. Можно ли этого достичь?

Ответы [ 2 ]

4 голосов
/ 24 февраля 2010

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 голос
/ 24 февраля 2010

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" }'

Однако не совсем понятно, чего вы пытаетесь достичь с помощью общего дизайна.

Вы можете узнать больше о вызове командной строки perl в perldoc perlrun , а также о создании модулей в p erldoc perlmod (а также о многих публикациях здесь, в Переполнение стека). *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...