2012-11-02 4 views
3

나는 stdin으로부터의 입력을 기대하거나, .log와 .log.gz 파일의 혼합으로부터 프로그램을 가지고있다. 다음은 프로그램에서 처리해야하는 세 가지 유형의 호출입니다.입력 파일을 균일하게 처리하는 방법

cat input.log | prog 
prog < input.log 
prog input.log input.log.gz 

프로그램은 모든 입력 파일을 하나로 간주합니다. 나는 균일하게 모든 입력을 처리 할 수 ​​ARGV에 투자 기대했다 :

while (<>) { 
# process input 
} 

내 목표는 같은 루프 GZ 파일을 처리하는 것입니다. 어떻게 할 수 있습니까? 나는 그것이 얼마나 지저분한 지 알고 싶다. 너무 나쁜 경우 gz를 별도로 처리 할 것입니다.

코어 모듈은 Perl 5.8.8에서만 사용할 수 있습니다.

+2

불쌍한 당신 ... 그 제한은 심각 펄 절름발이. 'IO :: Compress :: Gzip'과'IO :: Uncompress :: Gunzip'은 5.9.4 이후 핵심입니다. CPAN 모듈이없는 고대의 Perl 인터프리터에 어떤 이유가있을 수 있습니까? –

+0

모듈 지원이없는 gzip 파일을 처리하는 것을 고려하지 않았습니다. 당신은 'run'gzip -cd'에 들어가서 그 출력물을 읽을 수 있습니다. 호출자가 압축 해제를 처리하는 것이 더 간단합니다. –

+0

이 요구 사항이 마음에 들지 않아 불만을 토로했지만 지금 당장은 아무런 통제력이 없습니다. 모든 희망은 잃어버린 것이 아니라 다른 주제입니다! –

답변

1

정말 그렇게 할 수 없으며 다이아몬드 운영자의 약식 혜택을 얻을 수 없습니다.

  • 입력 핸들로 원숭이를보아야하기 때문에 파일을 직접 open해야합니다.
  • @ARGV을 사용할 수는 있지만이 파일을 다시 열면 *::STDIN을 다시 열면 쉽게 처리 할 수 ​​있습니다.

    my $file = shift; 
    if (!$file)   {} # use STDIN as is. 
    elsif ($file =~ /\.gz$/) { 
        open(::STDIN, '-|', "gunzip $file") or die "Could not open: $!!"; 
    } 
    else { 
        open(::STDIN, '<', $file) or die "Could not open $file: $!!"; 
    } 
    
    while (<>) { 
        ... 
    } 
    close STDIN; 
    
+0

나는 이것을 잘못 읽고 있니? gunzip이 잘못된 else 블록에있는 것처럼 보입니다. – mattc

+0

@mattc : 예, 있습니다. 파일이 gzip 접미어로 끝나면 'gunzip'을 사용해야한다고 가정합니다. – titanofold

+0

하하, 내가 논평 한 이후로 수정 된 것처럼 보입니다. – mattc

관련 문제