помочь с Perl-скриптом, преобразовывающим использование argv в использование getopts - PullRequest
1 голос
/ 15 августа 2011

Я пытаюсь преобразовать использование @ARGV с использованием Getopt::Std вместо этого в моем скрипте perl. Я получаю некоторые ошибки и мне нужна помощь, чтобы понять это.

Ошибка:

Use of uninitialized value in substr at ./h.pl line 33.
Use of uninitialized value in substr at ./h.pl line 33.
substr outside of string at ./h.pl line 33.
Use of uninitialized value in substr at ./h.pl line 33.
substr outside of string at ./h.pl line 33.
The 'month' parameter (undef) to DateTime::new was an 'undef', which is not one of the allowed types: scalar
 at /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/DateTime.pm line 176
    DateTime::new('undef', 'HASH(0xb6932d0)') called at ./h.pl line 33

Вот мой код. (закомментированный код работал с использованием @ARGV)

use strict;
use warnings;
use Getopt::Std;
use DateTime;

# Getopt usage
my %opt;
getopts ('fd:ld:h', \%opt);

$opt{h} and &Usage;
my $first_date     = $opt{fd};
my $last_date      = $opt{ld};

#unless(@ARGV==2)
#{
#    print "Usage: myperlscript first_date last_date\n";
#    exit(1);
#}
#
#my ($first_date,$last_date)=@ARGV;

# Convert using Getopts
my $date=DateTime->new(
{
  year=>substr($first_date,0,4),
  month=>substr($first_date,4,2),
  day=>substr($first_date,6,2)
});

while($date->ymd('') le $last_date)
{
  print $date->ymd('') . "\n";
  $date->add(days=>1);
}

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

Даже если вы думаете, что Getopt :: Std будет делать то, что вы хотите, используйте Getopt :: Long.По тем же причинам, по которым вы не просто свернули бы обработчик @ARGV вручную.

Цитировать (частично) tchrist в http://www.nntp.perl.org/group/perl.perl5.porters/2008/05/msg136952.html:

I на самом деле как Getopt :: Long ... Я не могу сказать достаточно хороших слов об этом, чтобы сделать это справедливо, которого он заслуживает ... Единственная проблема в том, что я просто не использую это достаточно.Держу пари, я не одинок.Кажется, что вначале мы просто хотим добавить - о, например, JUST ONE, SINGLE LITTLE -v, флаг.Ну, это так легко взломать вручную, что, конечно, мы делаем это ... Но, как и любой другой программный продукт, все эти вещи, похоже, перерастают свои первоначальные ожидания ... Getopt :: Long - этопросто замечательно , до, я полагаю, до любой работы, которую вы можете найти для нее.Слишком часто его отсутствие означает, что я в конечном итоге сделал больше работы для себя - или других - не использовав его изначально.

2 голосов
/ 15 августа 2011

"getopt, getopts - Обработка односимвольных переключателей с кластеризацией переключателей"

Так как допускаются только односимвольные переключатели $opt{fd} и $opt{ld} не определены.

Getopt :: Long делает то, что вы хотите.

use strict;
use warnings;
use Getopt::Long;

my $fd;
my $ld;

my $result = GetOptions(
    'fd=s' => \$fd,
    'ld=s' => \$ld,
);

die unless $result;

print "fd: $fd\n";
print "ld: $ld\n";
...