过于复杂的条件操作问题

时间:2010-11-24 22:11:38

标签: perl

所以这是一个有趣的代码片段,我正在努力,因为我的生活无法弄清楚我做错了什么。

( 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)。我玩过各种各样的组合,但似乎无法使这项工作。

我知道这可以分解并执行几个更简单的陈述来达到相同的结果,但好奇/固执已经变得更好,我想知道为什么上述不起作用。我们非常感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:4)

Perl的chomp返回已删除的字符数,而不是chomp'字符串。

但是作为对这类问题的一般回答,如果我不能得到类似的东西,我将完全扩展它(并简化,删除外部依赖项或者只是妨碍的事情但不是直到我可以看到一切正常工作(例如在每组语句之间打印返回值)。一旦完成,我将把这些陈述重新组合在一起,检查它仍然有效。

完成后,将现有的内容与之前的内容进行比较,这应该告诉你它为什么不起作用(尽管你很可能会在路上找到它,就好像其中一个功能一样)正在回归你没想到的东西。)

答案 1 :(得分:3)

chomp返回删除的字符数,而不是结果字符串。

答案 2 :(得分:2)

如果找不到blah,那么whereis blah的输出就是

blah:

并且whereis blah | awk '{print $2}'的输出只是一个空行(即只是一个换行符)。在您的Perl脚本中,$CMD最初会设置为"\n",然后会chomp消失。但是,因为chomp将返回1,所以第二个命令(whereis cat ...)将不会被执行。所以你的程序完全按照你所说的去做。

我会尝试更简单的陈述并尝试获得不同的结果。

答案 3 :(得分: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;