Слишком сложный вопрос условной операции - PullRequest
0 голосов
/ 25 ноября 2010

Итак, вот забавный фрагмент кода, над которым я работал, и по жизни я не могу понять, что я делаю неправильно.

( 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 никогда не выполняется.Я включил «бла» и «кошка» исключительно для демонстрационных целей.В идеале я буду проверять две команды, которые могут или не могут быть установлены в данной системе.Вот почему у меня есть два назначения, вложенные в условные выражения.Если ни один из них не найден (следовательно, две пустые строки), я бы хотел выполнить предложение false.Но если та или иная команда существует, я хочу назначить ее для $ CMD и выполнить условие true (просто напечатав $ CMD в приведенном выше примере).Я играл с различными комбинациями, но, похоже, не смог справиться с этой задачей.

Я знаю, что это можно разбить на несколько простых утверждений, чтобы достичь того же результата, но любопытство / упрямство стало лучшеот меня, и я хочу знать, почему выше не работает.Мы будем благодарны за любую помощь, которую вы можете оказать.

Ответы [ 4 ]

4 голосов
/ 25 ноября 2010

Perl's chomp возвращает количество удаленных символов, а НЕ строку chomp '.

Но в качестве общего ответа на подобные проблемы, если я не могу заставить что-то подобное работать, я полностью расширю это (и упросту, удаляя такие вещи, как внешние зависимости или вещи, которые просто мешают, но не радуют). не уместно), пока я не увижу, что все работает (например, печать возвращаемых значений между каждым набором операторов). Как только это будет сделано, я соберу утверждения по частям, шаг за шагом, проверив, как все это работает.

Как только вы закончите, сравните то, что у вас есть сейчас, с тем, что у вас было раньше, и это должно сказать вам, почему это не сработало (хотя, скорее всего, вы поймете это по пути, например, если одна из функций возвращал то, чего вы не ожидали).

3 голосов
/ 25 ноября 2010

chomp возвращает количество удаленных символов, а не полученную строку.

2 голосов
/ 25 ноября 2010

Если blah не может быть найдено, то вывод whereis blah равен просто

blah:

, а вывод whereis blah | awk '{print $2}' - просто пустая строка (т. Е. Просто символ новой строки).В вашем Perl-скрипте $CMD изначально будет установлен на "\n", а затем будет chomp 'd.НО, поскольку chomp вернет 1, вторая команда (whereis cat ...) не будет выполнена.Так что ваша программа делает именно то, что вы сказали.

Я бы попробовал более простые выражения и попытался бы получить другой результат.

1 голос
/ 25 ноября 2010
#!/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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...