帮助perl脚本将argv的使用转换为使用getopts

时间:2011-08-14 20:59:51

标签: perl getopt

我试图在我的perl脚本中使用Getopt::Std来转换@ARGV的使用。 我得到了一些substr错误,需要一些帮助来解决这个问题。

错误:

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 个答案:

答案 0 :(得分:3)

即使你认为Getopt :: Std会做你想要的,也可以使用Getopt :: Long。出于几乎相同的原因,您不仅要手动滚动@ARGV处理程序。

http://www.nntp.perl.org/group/perl.perl5.porters/2008/05/msg136952.html中引用(部分)tchrist:

  

真的喜欢Getopt :: Long ...我不能说它应该得到足够好的东西它应得的正义......唯一的问题是我只是不使用它足够。我敢打赌,我并不孤单。似乎发生的事情是,起初我们只想添加 - 哦,例如JUST ONE,SINGLE LITTLE -v标志。嗯,这很容易手工黑客,当然我们这样做......但就像任何其他软件一样,这些东西似乎都有一种过度增长的原始期望...... Getopt :: Long is只是精彩,起来 - 我相信 - 对于你能想到的任何工作。它的缺席往往意味着我从长远来看为自己或其他人做了更多的工作,因为他们最初没有使用它。

答案 1 :(得分:2)

“getopt,getopts - 使用交换机群集处理单字符交换机”

由于只允许单个字符开关$opt{fd}$opt{ld}为undef。

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";