Forum Webscript.Ru
Программирование => Perl => Тема начата: Skif от 01 Июня 2005, 15:46:43
-
Объясните как правильно с ними работать?
Есть острая необходимость написать скрипт для фильтра в postfix, имеется пример в документации написанный на шел. вывод с smtpd демона в файл там передается так:
cat _> $DIR/$$ || { echo Cannot save mail to file; exit EX_TEMPFILE; }
сам фильтр привязывается таким способом(кусок master.cf)
smtp _ _inet _ _n _ _ _ - _ _ _ n _ _ _ - _ _ _ 10 _ _ _ smtpd
_ _ _ _ _ _ _ _ -o content_filter=mailfilter:dummy
mailfilter unix _- _ _ _ n _ _ _ n _ _ _ - _ _ _ 10 _ _ _ pipe
_ _flags=Rq user=pupkin argv=/usr/local/script/mail/mailfilter.sh -f ${sender}
-- ${recipient}
тоесть исходя из этого ясно, что smtpd просто передает на STDOUT содержимое сообщения в clear-text.
Вот это и нужно словить.
Самый простой способ, который напрашивается - system и кусок из shell скрипта. Но это, по моему не правильно и не красиво.
Может кто, пояснить как "правильно", схватить это сообщение?
пробовал и так:
open STDOUT, \'>\', "/tmp/foo.out" or die "Can\'t redirect STDOUT: $!";
print STDOUT $_;
close STDOUT;
и так
open STDOUT, \'>\', "/tmp/foo.out" or die "Can\'t redirect STDOUT: $!";
print STDOUT STDIN;
close STDOUT;
и еще парой методов - не получается. Пробовал уазывать в качестве пути к файлу STDOUT/STDIN - тоже ноль.
Подскажите, как словить вывод от программы?
-
быстрое решение, - перенеси close STDOUT перед open STDOUT...
и на будущее
perldoc -f open, тут с примерами, пояснениями, хитростями и пр..
-
ondr
в том же perldoc -f open
сказано следующее
Though if you try to re-open "STDOUT" or "STDERR" as an "in
memory" file, you have to close it first:
close STDOUT;
open STDOUT, \'>\', \\$variable or die "Can\'t open STDOUT: $!";
тоесть, если повторно, нужно открыть. А я первый раз хочу открыть.
-
М-да...
Честно говоря, пришлось ради банальной вещи потратить почти 6 часов, пока не добрался домой и не полистал "Programming Perl"... Все что необходимо было, это напомнить, что дескриптор STDIN уже заранее определен в системе, и что бы получить данные нужно:
$mess=;
сделать или, что более правлиьно для получения многострочечного вывода,
@mess=;
И всего-то...