如果不进行评估,则使用Perl

如果不进行评估,则使用Perl,perl,string,flow-control,Perl,String,Flow Control,有人看到这个代码有什么问题吗?当我们(在Linux上)执行它时,会直接进入“Error:Unknown host”块 Perl是5.8.6版 $hostname = "host2"; if ($hostname eq "host1") { $dbhost = 'dbi:Oracle:dbhost1'; } elsif ($hostname eq "host2") { $dbhost = 'dbi:Oracle:dbhost2'; } elsif ($hostname eq "host3

有人看到这个代码有什么问题吗?当我们(在Linux上)执行它时,会直接进入“Error:Unknown host”块

Perl是5.8.6版

$hostname = "host2";

if ($hostname eq "host1") {
  $dbhost = 'dbi:Oracle:dbhost1';
}
elsif ($hostname eq "host2") {
  $dbhost = 'dbi:Oracle:dbhost2';
}
elsif ($hostname eq "host3" || $hostname eq "host4") {
  $dbhost = 'dbi:Oracle:dbhost3';
}
else {
  print "ERROR: UNKNOWN HOST\n";
  die "Can't connect";
}

你的代码没有问题。它按照我的预期执行。

您的代码没有问题。它按照我的预期执行。

代码没有问题。但是,使用查找表会更简单(也更灵活):


PS:您是否忘记了
咀嚼$hostname

代码没有问题。但是,使用查找表会更简单(也更灵活):


PS:你忘了
咀嚼$hostname
了吗?

在我看来还行,在5.8.9上运行良好。您正在使用哪个版本的perl?在“这是为x86_64-linux-gnu-thread-multi构建的perl,v5.10.1(*)下(Ubuntu 10.04.1 LTS)对我有效。您的确切主机是什么,perl版本,这是完整的代码吗?您确定生产代码中定义了
$hostname
?您是否正在运行
使用警告;严格使用?您确定
$hostname
没有多余的空格吗?您是否已删除$hostname变量中所有不可见的字符?在我看来还可以,在5.8.9上运行良好。您正在使用哪个版本的perl?在“这是为x86_64-linux-gnu-thread-multi构建的perl,v5.10.1(*)下(Ubuntu 10.04.1 LTS)对我有效。您的确切主机是什么,perl版本,这是完整的代码吗?您确定生产代码中定义了
$hostname
?您是否正在运行
使用警告;严格使用?您确定
$hostname
没有多余的空格吗?您是否已将$hostname变量中所有不可见的字符删除?如果您认为$hostname确实是“host2”,我会验证它。如果您认为是,我会验证$hostname确实是“host2”。argh…缺少的chomp确实是问题所在。但是,为什么调试器从不显示任何其他正在求值的elsif子句?它只是直接跳到另一个。啊……缺失的咀嚼确实是问题所在。但是,为什么调试器从不显示任何其他正在求值的elsif子句?它只是直接跳到另一个。
my $driver = 'dbi:Oracle:';
my %dbihosts = (
    host1 => 'dbhost1',
    host2 => 'dbhost2',
    host3 => 'dbhost3',
    host4 => 'dbhost3',
);

my $hostname = "host2";

die "Unknown host '$hostname'" unless exists $dbihosts{ $hostname };

my $dbhost = $dbihosts{ $hostname };
print "$hostname -> $dbhost\n";

$dbh->connect("$driver$dbhost", ...);