perl
  • string
  • flow-control
  • 2010-08-12 46 views 1 likes 
    1

    任何人看到這個代碼有什麼問題?當我們執行它(在Linux上)時,我們直接轉到「錯誤:未知主機」塊。Perl elsif沒有被遺漏

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

    看起來對我很好,並且在5.8.9上正常工作。您使用的是哪個版本的perl? – Doon 2010-08-12 18:43:04

    +0

    在「This is perl,v5.10.1(*)for x86_64-linux-gnu-thread-multi」(Ubuntu 10.04.1 LTS)下適用於我。什麼是你的確切的主機,Perl版本,這是完整的代碼? – 2010-08-12 18:43:09

    +2

    你確定在生產代碼中定義了「$ hostname」嗎?你是否正在使用'使用警告;嚴格使用;'? – 2010-08-12 18:43:27

    回答

    8

    代碼沒有問題。但是,使用查找表會更簡單(更靈活):

    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

    +0

    Arggh ....缺失的chomp確實是個問題。但是,爲什麼調試器從不顯示任何正在評估的其他elsif子句?它只是直接跳到其他地方。 – wadesworld 2010-08-12 18:55:09

    1

    版本沒有什麼你的代碼錯誤。它按照我的預期執行。

    +1

    我想驗證$ hostname是否真的是'host2'。 – edebill 2010-08-12 18:43:27

    相關問題