3

If-Elseブロックでユーザー入力を受け入れています。チェックコード:

if ( $svr == 1 ) {
    print "Enter Datbase Name\n";
    my $db = <>;
    chomp($db);
} elsif ( $svr == 2 ) {
    print "Enter Data Source Name (DSN)\n";
    my $db = <>;
    chomp($db);
}

後のステートメントで$dbを参照すると、次のエラーが発生します。

「初期化されていない値$dbの使用」

これは、エラーの原因となっている$dbを使用しているステートメントです。

my $data_source = 'DBI:mysql:' . $db . ':' . $host;

助けてください

4

4 に答える 4

5

最初の$dbスコープは「then」ブロックにスコープされ、2番目$dbのスコープは「else」ブロックにスコープされます。$dbの前にvarを宣言する必要がありifます。

my $db;
if($svr==1) {
 print "Enter Datbase Name\n";
 $db=<>;
 chomp($db);
} elsif($svr==2) {
 print "Enter Data Source Name (DSN)\n";
 $db=<>;
 chomp($db);
}
于 2012-07-13T20:05:59.960 に答える
2

$dbif/elseブロックの外側で定義します。ブロック内で定義することにより、変数のスコープをそれらのブロックに制限します。

my $db;
if($svr==1) {
  print "Enter Datbase Name\n";
  $db=<>; 
  chomp($db);
} elsif($svr==2) {
  print "Enter Data Source Name (DSN)\n";
  $db=<>;
  chomp($db);
}
于 2012-07-13T20:04:48.437 に答える
2

ステートメントはmy、スコープ内の変数、つまり中括弧を宣言します。外部では定義されていません。my $dbif / elseブロックの外側に配置すると、機能するはずです。共通のスコープがない場合は、を使用してグローバル変数にする必要がありますour。詳細perldoc -f myはをご覧ください。

于 2012-07-13T20:06:56.213 に答える
1

あなたには答えがありますが、私が見ていないロジックがもっとない限り、あなたはそれをあなた自身でさらに簡単にするかもしれません...

if($svr==1) {
  print "Enter Datbase Name\n";
} elsif($svr==2) {
  print "Enter Data Source Name (DSN)\n";
}

my $db=<>;
chomp($db);

あるいは

print $svr==1 ? "Enter Datbase Name\n" : "Enter Data Source Name (DSN)\n";
my $db=<>;
chomp($db);

これは単なる見た目以上のものです。Do n't Repeat Yourself(DRY)は重要です。将来、何かを変更する必要がある場合、各場所で変更することを忘れてしまう可能性があるためです。これは、優れたコードを作成するための積極的なステップです。

これらのifステートメントにさらにロジックがある場合は、次のようなものを試してください。

sub prompt {
  my $question = shift;
  print $question . "\n";
  my $response = <>;
  chomp $response;
  return $response;
}

my $db;
if($svr==1) {
  $db = prompt("Enter Datbase Name");
} elsif($svr==2) {
  $db = prompt("Enter Data Source Name (DSN)");
}
于 2012-07-14T00:21:32.617 に答える