2013-05-21 51 views
1

我想測試一個反向輸出字符串(它是一個字符串,對嗎?)包含一個子字符串。Perl索引函數不工作?

my $failedCoutner = 0; 
my $tarOutput = `tar -tvzf $tgzFile`; 
print "$tarOutput\n"; 

my $subStr = "Cannot open: No such file or directory"; 
if (index($tarOutput, $subStr) != -1) 
{ 
    push(@failedFiles, $tgzFile); 
    $failedCounter++; 
    print "Number of Failed Files: $failedCounter\n\n\n"; 
} 
print "Number of Failed Files: $failedCounter\n\n\n"; 

但是這不起作用。它從不輸入if語句。

倒引號輸出:

tar (child): /backup/Arcsight/EDSSIM004: Cannot open: No such file or directory 
tar (child): Error is not recoverable: exiting now 
tar: Child returned status 2 
tar: Error is not recoverable: exiting now 

Number of Failed Files: 0 

顯然子串是在第一行。爲什麼它不認識到這一點?

+6

你確定輸出實際上是在'$ tarOutput'嗎?我的猜測是它實際上會變得更加stderr。嘗試添加像'print'這樣的tar輸出是[$ tarOutput] \ n「'來查看實際內容。 – friedo

+0

打印像'$ tarOutput'這樣的值總是好事,以確保它們是你自己認爲的。 –

+0

如果您需要從stdout和stderr中讀取,請嘗試[IPC :: Open3](https://metacpan.org/module/IPC::Open3)。 – friedo

回答

0

檢查backticks產生的誤差$?

use warnings; 
use strict; 

my $tarOutput = `tar -tvzf doesnt_exist.tar.gz`; 
if ($?) { 
    print "ERROR ... ERROR ... ERROR\n"; 
} 
else { 
    # do something else 
} 

__END__ 

tar (child): doesnt_exist.tar.gz: Cannot open: No such file or directory 
tar (child): Error is not recoverable: exiting now 
tar: Child returned status 2 
tar: Error is not recoverable: exiting now 
ERROR ... ERROR ... ERROR 
1

tar,最喜歡的節目,將錯誤信息寫入STDERR。這是STDERR的目的。

反引號只捕捉STDOUT。

您可以將tar的STDERR重定向到它的STDOUT,但爲什麼不只是檢查其退出代碼。

system('tar', '-tvzf', $tgzFile); 
die "Can't launch tar: $!\n" if $? == -1; 
die "tar killed by signal ".($? & 0x7F) if $? & 0x7F; 
die "tar exited with error ".($? >> 8) if $? >> 8; 

優點:

  • 捕獲所有的錯誤,不只是一個。
  • 直到tar在發送到屏幕前完成輸出纔會保持。
  • 它解決了在不調用String :: ShellQuote的shell_quote的情況下名稱中帶有shell元字符(例如空格)的歸檔問題。
+0

好的,現在我想跟蹤產生錯誤的文件。我如何保存並在最後查看它們? – geeoph

+0

@ user215654假設'tar'在成功時返回一個退出代碼爲'0',它就像'push @failed'一樣簡單,$ tgzFile'$';' –