2011-08-14 2 views
1

私のperlスクリプトの代わりにGetopt::Stdを使用して@ARGVの使用を変換しようとしています。 私はいくつかのsubstrエラーを取得しており、これを理解する助けが必要です。perlスクリプトの助けを借りてargvをgetoptsの使用に変換する

エラー:ここ

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 

が私のコードです。

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)[email protected]; 

# 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

(コード@ARGVを使用してコードを働いていたコメントアウト) - 単一文字のスイッチが許可されているように、「の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"; 
+0

その点をご理解いただきありがとうございます。 – jdamae

3

Getopt :: Stdがあなたの望むことをやっても、Getopt :: Longを使用してください。 @ARGVハンドラをハンドリングするのと同じ理由で、同じ理由があります。 http://www.nntp.perl.org/group/perl.perl5.porters/2008/05/msg136952.htmlに(部分的に)tchristを引用する

私は本当に Getoptのような::ロング...私はそれをそれに値する正義を行うにはそれについて十分に良いものを言うことができません...唯一の問題は、私はそれだけで十分ではないということです。私は一人ではないと思う。起こっているように見えるのは、最初に、ちょうど1つ、少々弱い-vフラグを追加することです。さて、これは簡単に手でハックするのは簡単ですが、そうしています...しかし、他のソフトウェアと同様に、これらはすべて元の期待を上回る方法を持っているようです... Getopt :: Long isただ素晴らしい、私は信じて - あなたはそれを思い付くことができます。あまりにも頻繁に欠席しているということは、私が長期的には、もともとそれを使用していないことによって、自分自身または他の人のために多くの仕事をしたことを意味します。

+0

私はまさにその感情をエコーし​​たあまりにも遠くない過去において、いつか別のブログ記事を読む。すべてのコマンドラインオプションを細かくするために常に 'Getopt :: Long'を使うべきです。私はリンクを見つけるためにinterwebsを梳いていますが、多分誰かが覚えていますか? –

+0

私はそれをperlmonks(2008年に戻って)とかなり最近ここで引用しました。 – ysth

関連する問題