【问题标题】:Perl elsif not being evaluatedPerl elsif 没有被评估
【发布时间】:2011-03-29 02:31:21
【问题描述】:

有人发现这段代码有什么问题吗?当我们(在 Linux 上)执行它时,我们会直接进入“错误:未知主机”块。

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";
}

【问题讨论】:

  • 对我来说看起来不错,并且在 5.8.9 上运行良好。你使用的是哪个版本的 perl?
  • 在“这是为 x86_64-linux-gnu-thread-multi 构建的 perl,v5.10.1 (*)”(Ubuntu 10.04.1 LTS)下为我工作。你的确切主机是什么,perl 版本,这是完整的代码吗?
  • 您确定在您的生产代码中定义了$hostname 吗?你在使用use warnings; use strict;吗?
  • 你确定$hostname 没有多余的空格吗?
  • 您是否已将 $hostname var 中的所有不可见字符剥离?

标签: perl string flow-control


【解决方案1】:

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

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", ...);

PS:你忘记chomp $hostname了吗?

【讨论】:

  • Arggh....缺失的 chomp 确实是问题所在。但是,为什么调试器从不显示正在评估的任何其他 elsif 子句?它只是直接跳到其他地方。
【解决方案2】:

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

【讨论】:

  • 当您认为 $hostname 确实是“host2”时,我会验证它。
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多