Я изменяю 16-летний сценарий Perl на производственном сервере telco, работающем под perl v5.8.8, созданным для i386- linux -thread-multi.
При возникновении тревоги сценарий просматривает некоторые вложенные папки журналов, чтобы определить виновное приложение на основе идентификатора сеанса.
Я столкнулся с проблемой буферизации STDOUT, в результате которой был получен grep ( путь к файлу) неправильно назначен переменной. У меня есть запись команды grep, поэтому я могу дважды проверить скрипт и, конечно же, время от времени результат grep теряется, а переменная остается пустой. Я пробовал несколько различных синтаксисов, но у всех одинаковое поведение.
Я не могу обновить версию Perl или изменить ее каким-либо образом.
Код приведен ниже. Предыдущий синтаксис закомментирован.
binmode( STDOUT, ":unix" );
#my $returnval = readpipe("$grepcommand");
#my $returnval = qx/$grepcommand/;
#my $returnval = `$grepcommand`;
#my $returnval = qx ("\$grepcommand");
# seems to give more reliable results than the alternate approaches above which also work:
my $returnval;
open CMD,'-|',"$grepcommand" or die $@;
my $commandoutput;
while (defined($commandoutput=<CMD>)) {
$returnval = $commandoutput;
}
close CMD;
chomp $returnval;
print "grep command is $grepcommand\n";
print "corresponding file found by grep command is $returnval\n";