2010-11-24 2 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에 대한 두 번째 할당은 절대로 실행되지 않습니다. 순전히 데모 목적으로 "ㅋ"및 "고양이"를 포함 시켰습니다. 이상적으로는 주어진 시스템에 설치되어 있거나 설치되어 있지 않은 두 개의 명령을 검사 할 것입니다. 이 때문에 두 조건부를 조건부에 중첩시켜야합니다. 이들 중 어느 것도 발견되지 않으면 (따라서 두 개의 빈 문자열) 거짓 절을 실행하고 싶습니다. 그러나 명령 중 하나 또는 다른 명령이 존재하면 $ CMD에 할당하고 true 절을 실행합니다 (위 예제에서 $ CMD를 인쇄하는 것). 나는 다양한 조합으로 연주했지만이 작품을 만들 수 없습니다.

동일한 결과를 얻으려면 몇 가지 간단한 문구를 통해이 구문을 분석 할 수 있지만 호기심/완고함이 내게 좋으며 나는 위의 이유가 작동하지 않는 이유를 알고 싶습니다. 당신이 제공 할 수있는 도움은 매우 감사 할 것입니다.

+2

대신 빈 상태에서 조건부 연산자를 사용하는 것을 싫어합니다. 또는 awk에게 뭔가를 해달라고 부탁하십시오. – tchrist

답변

4

Perl의 chomp은 제거 된 문자 수를 반환하지만 chomp 문자열은 반환하지 않습니다.

그러나 이와 같은 문제에 대한 일반적인 대답으로, 내가 작동하도록 할 수 없다면, 나는 그것을 완전히 확장 할 것입니다. (그리고 외부 의존성이나 그냥 방해가되는 것들을 제거하고 단순화합니다. 관련이 없다) 모든 것이 작동하는 것을 볼 수있을 때까지 (예를 들어 각 문장 집합 사이에 반환 값을 출력하는 경우). 일단 그것이 끝나면, 나는 진술을 다시한데 모아서, 그것이 작동하는 방식으로 점검 할 것이다.

일단 작업을 마치면 이전에 갖고있는 것과 지금 비교 한 것과 작동하지 않는 이유를 알려 주어야합니다. (그래도 길을 따라 알아 냈을 가능성이 높습니다. 함수는 당신이 기대하지 않았던 것을 반환하고있었습니다).

3

chomp은 결과 문자열이 아니라 제거 된 문자 수를 반환합니다. blah 찾을 수 없으면

2

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; 
관련 문제