2

スクリプトを実行すると、次のエラーが表示されます。

Use of uninitialized value $user in scalar chomp at ./temp.pl line 38, <DATA> line 558.
Use of uninitialized value $modelName in scalar chomp at ./temp.pl line 39, <DATA> line 558.
Use of uninitialized value $Application in scalar chomp at ./temp.pl line 40, <DATA> line 558.
Use of uninitialized value $user in string eq at ./temp.pl line 42, <DATA> line 558.

コードは次のとおりです。誰かがこれについて私を助けることができます:

my ($user) = $ARGV[0];
my ($modelName) = $ARGV[1];
my ($Application) = $ARGV[2];

chomp($user);
chomp($modelName);
chomp($Application);

if ( ($user eq "") || ($modelName eq "") || ($Application eq "")) {
  &usage;
}

sub usage {
  print "\tUsage : $0 User ModelName Application\n";
  exit (1);
}
4

2 に答える 2

4

プログラムは、コマンド ラインでパラメーター (ユーザー、モデル名、およびアプリケーション) を想定していますが、何も指定していません。

chomp新しい行で終わることはないため、コマンド ラインから値を渡す必要はありません。

あなたのコードはこのように書かれた方が良いです

usage() unless @ARGV == 3;

my ($user, $modelName, $Application) = @ARGV;
于 2012-08-06T03:04:33.083 に答える
0

プログラムを実行するときに、コマンド ラインに 3 つのパラメーターを入力するとします。ただし、プログラムでそうするかどうかを確認するチェックはありません。したがって、最初のパラメーターがない場合、$ARGV[0]は null であり、 も同様です$user。使用するchompと、エラーが発生します。これは、プログラムのわずかに変更されたバージョンです。

use strict;
use warnings;

# Let's give some directions

my $usage <<USAGE;

    Usage: <program> <user> <model> <application>

    All parameters are required!

USAGE

if (scalar @ARGV != 3) {
   die "$usage";
}

my $user =        shift;
my $modelName =   shift;
my $Application = shift;

# No need for this

chomp $user;
chomp $modelName;
chomp $Application;

いくつかのことに注意してください。

  • 私はプラグマを持っuse strictています。use warningsすべてのプログラムで常にこれらを使用してください。これらは、人々がプログラムで犯すエラーの約 90% を発見するのに役立ちます。
  • 他のことをする前に、引数があるかどうかを確認します。私はスカラー値scalarを強制的@ARGVに与えて (このコンテキストではとにかくそうします)、実際に 3 つだけの値があるかどうかを確認します。3 つの値がない場合は、使用法テキストを指定します。
  • コマンド ライン パラメーターをむさぼり食う必要はありません。各ファイル行は EOL 文字で読み込まれるため、チョッピングはファイル入力でのみ必要です。これは主に<...>、行が単に空白の場合に がゼロを返さないようにするために行われます。行が空白の場合、<...>少なくとも 1 つの NL 文字が返されます。

もう一つ...

$usageサブルーチンよりもテキストを使用するのが好きです。私はプログラムの一番上に使用法テキストを設定し、私のコードを見る人がそれを見ることができ、プログラムがどのように使用されているかを正確に読むことができます. die使用法テキストをステートメントに入れることもできます。

さらに、サブルーチンで何かを出力するのは悪い形式です。サブルーチンは、呼び出しプログラムが操作できる値を返す必要があります。

于 2012-08-06T04:03:53.050 に答える