2010-11-24 51 views
0

所以這裏有一個有趣的代碼片段,我正在努力,併爲我的生活無法弄清楚我做錯了什麼。過於複雜的條件操作問題

(chomp($CMD=`whereis blah | awk '{print \$2}'`) || 
    chomp($CMD=`whereis cat | awk '{print \$2}'`)) ? 
    (print "$CMD\n") : (print "Neither command exists."); 
print "$CMD\n"; 

執行時,它總是打印空字符串。據我所知,第二個賦予$ CMD的任務永遠不會被執行。我純粹將「blah」和「cat」包含在演示中。理想情況下,我將檢查兩個可能或不可能安裝在給定系統上的命令。這就是爲什麼我有兩個任務嵌套在條件內。如果這兩個都沒有找到(因此有兩個空字符串),我希望它執行false子句。但是,如果其中一個或另一個命令確實存在,我希望它分配給$ CMD並執行true子句(僅在上面的示例中打印$ CMD)。我玩過各種組合,但似乎無法完成這項工作。

我知道這可以分解並執行幾個簡單的語句來實現相同的結果,但好奇心/固執已經越來越好,我想知道爲什麼上述不起作用。任何幫助你可以提供將不勝感激。

+2

我寧可不喜歡在void上下文中使用條件運算符。或者打電話給awk做一些事情。 – tchrist 2010-11-24 22:24:41

回答

4

Perl的chomp返回刪除的字符數,而不是chomp'd字符串。

但是,作爲對此類問題的一般回答,如果我無法得到類似這樣的工作,我會完全展開它(並簡化,移除像外部依賴項或事物那樣的東西,是不相關的),直到我能看到一切正常(例如,在每組語句之間打印返回值)。一旦完成,我會將這些聲明一塊一塊放回原處,一路檢查它是否仍然有效。

一旦你完成了,現在把你現在和過去所做的比較,然後告訴你它爲什麼不起作用(儘管更有可能你會一路想通,就像其中一個函數正在返回一些你並不期待的東西)。

3

chomp返回刪除的字符數,而不是結果字符串。

2

如果blah不能找到,則whereis blah輸出僅僅是

blah: 

whereis blah | awk '{print $2}'輸出僅僅是一個空行(即,只是一個換行字符)。在您的Perl腳本中,$CMD最初將被設置爲"\n",然後這將是chomp'd。但因爲chomp將返回1,所以第二個命令(whereis cat ...)不會被執行。所以你的程序完全按照你所說的去做。

我會嘗試更簡單的語句,並嘗試獲得不同的結果。

1
#!/usr/bin/env perl 

use 5.10.0; 

use utf8; 
use strict; 
use autodie; 
use warnings qw< FATAL all >; 
use open qw< :std OUT :utf8 >; 

END {close STDOUT} 
$| = 1; 

sub whence(_) { 
    my($aout, $path) = shift(); 
    for my $bin (split /:/ => $ENV{PATH}) { 
     return $path if -f -x ($path = "$bin/$aout"); 
    } 
    # FALLTHROUGH 
} 

say "$_: ", whence for @ARGV;