Как использовать GetOptions в модуле Perl - PullRequest
0 голосов
/ 11 октября 2019

У меня есть код main.pl, где я вызываю функцию модуля perl, например:

genspicemeas::genspicemeas({-f=>"filename", -block => $block, -log => $LOG})
#assume block are initialized in the main.pl

# LOG - это дескриптор файла в main.pl: пожалуйста, укажите, как обрабатывать этот # в моих GetOptionsссылка на модуль perl

My genspicemeas.pm выглядит следующим образом:

package genspicemeas;
use strict;
use Getopt::Long;

sub genspicemeas {
my($opt_file,$opt_block);
GetOptions(
 'f'=>\$opt_file,
 'block' =>\$opt_block);
 print "block name is $opt_block and file name is $optfile\n";
}
1;

Когда я запускаю main.pl, я ожидаю, что он напечатает имя блока и имя файла из оператора print вgenspicemeas.pm, однако это печать значений NULL. Кажется, переменные не передаются в модуль Perl, который я написал. Пожалуйста, я новичок в использовании модулей Perl, поэтому, пожалуйста, любая помощь приветствуется.

1 Ответ

2 голосов
/ 11 октября 2019

GetOptions обрабатывает @ARGV, поэтому просто добавьте

local @ARGV = %{ $_[0] };

Тем не менее, гораздо менее волшебно использовать GetOptionsFromArray из того же модуля.

GetOptionsFromArray([%{ $_[0] }], ...)

Но нет смысла использовать

genspicemeas::genspicemeas({ -f => "filename", -block => $block })

вместо

genspicemeas::genspicemeas( -f => "filename", -block => $block )

С последним вы бы добавили следующее:

local @ARGV = @_;

ИНиже приводится подход GetOptionsFromArray:

GetOptionsFromArray(\@_, ...)

Обратите внимание, что при использовании GetOptions или GetOptionsFromArray вы можете использовать параметры, установленные в других местах программы, если вы не используете Configure дляустановите их соответствующим образом перед вызовом GetOptions или GetOptionsFromArray.


Наконец, я бы просто использовал

sub genspicemeas {
   my %opts = @_;

   defined($opts{f}) or die(...);   # Optional validation.
   $opts{block} //= ...;            # Optional setting default.

   print "block name is $opts{block} and file name is $opts{f}\n";
}

genspicemeas::genspicemeas( f => "filename", block => $block );

Вы можете даже смешивать позиционные и опции.

sub search {
   my $term = shift;
   my %opts = @_;

   ...
   if ($opts{case_insensitive}) { ... }
   ...
}

search("foo");
search("foo", case_insensitive => 0);
search("foo", case_insensitive => 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...