2013-05-21 7 views
1

Я пытаюсь проверить, если выходная строка backtick (это строка, справа?) Содержит подстроку.Функция индекса 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 output [$ 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.

Вы можете перенаправить STDERR tar на его 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's shell_quote.
+0

Хорошо, теперь я хочу отслеживать файлы, которые вызывают ошибки. Как я могу сохранить их и просмотреть их в конце? – geeoph

+0

@ user215654, предполагая, что 'tar' возвращается с кодом выхода' 0' при успехе, было бы так же просто, как 'push @failed, $ tgzFile, если $ ?;' –

 Смежные вопросы

  • Нет связанных вопросов^_^