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”块,第二个$db范围为“else”块。您需要$dbif.

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

$db在 if/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);

这不仅仅是化妆品。不要重复自己 (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 回答