Титла: Perl, MailScanner, искам да го променя малко, ама не знам как :) Публикувано от: laskov в Apr 03, 2013, 17:14 В MailScanner има възможност за добавяне на действия. Демо програмката е такава:
Код Аз замених реда "print STDERR" със следващия за да видя какво се случва - получавам съобщение (нямам предвид писмото) в системния лог. Искам да стартирам външен скрипт, на който да подавам като параметър това "$flag", но не знам как се прави това от Perl. PS: Хм. То чрез гугъл и програмист можело да станеш :) . Според това ($2), мисля да ползвам system() . Остава да разбера как се подава параметър. PS2: Та вместо това " MailScanner::Log::InfoLog..." искам да стартирам външен скрипт. Титла: Re: Perl, MailScanner, искам да го променя малко, ама не знам как :) Публикувано от: schemer в Apr 03, 2013, 21:32 В такива ситуации е по-добре да се консултираш с официалната документация - http://perldoc.perl.org/functions/system.html
Имай предвид, че Пърл ще изчака външния процес да приключи, преди да продължи с изпълнението на кода. Ако не ти харесва, може да използваш fork (). $dir = '/'; system ('/bin/ls', $dir); Титла: Re: Perl, MailScanner, искам да го променя малко, ама не знам как :) Публикувано от: Demayl в Apr 03, 2013, 22:48 С system() е най-добре да го направиш защото ескейпва подадените параметри. Синтаксиса е system('path/to/bin',arg1,arg2.....). Иначе мързеливо може с `/path/to/bin arg arg2` или даже с qx{/path/to/bin arg arg2}, но последните са security проблемни. Ако искаш да пишеш резултата по добре използвай pipe или директно от perl да запишеш в искания файл ( open FILE, ">>", "/path/to/file" ; print FILE $flag; close FILE; )
Титла: Re: Perl, MailScanner, искам да го променя малко, ама не знам как :) Публикувано от: laskov в Apr 04, 2013, 09:58 Благодаря!
Мисля да е така: @args = ("/път/bash-скрипт", $flag, "1> /dev/null 2> /dev/null"); system(@args); Скриптът ще съдържа echo "Имаш поща" | smbclient -M sysadmin където sysadmin е име на хост. Може да завърши с грешка по много причини, но не искам да знам за това, нито пък искам програмата да чака края на изпълнението му и затова се питам къде да сложа в края на командата един & и дали ще работи. Заработи ето така: system("/path/to/mailnotify_script $flag 1> /dev/null 2> /dev/null"); Може ли да ми разясните какво правят останалите редове в програмката-пример най-горе? Титла: Re: Perl, MailScanner, искам да го променя малко, ама не знам как :) Публикувано от: Demayl в Apr 04, 2013, 14:23 package MailScanner::CustomConfig; - Това е името на модула ( нещо като клас )
use strict 'vars'; - като е написано изисква променливите да се дефинират предварително use strict 'refs'; - грешка ако се ползва symbolic референция no strict 'subs'; - не дава грешка като използваш някаква дума която иначе трябва да е функция ( не знам как по-добре да го обясня ) use vars qw($VERSION); - прави глобална променлива $VERSION $VERSION = substr q$Revision: 2331 $, 10; - От стринга който е заграден между q$$ / с q се заместват ' / се взима всичко от десетия символ до края sub CustomAction { - Деклариране на функция my($message, $yes_or_no, $flag) = @_; - Дефиниране на 3 променливи като се взимат от параметрите на функцията / @_ е масив като от него се взимат аргументите с референция/ MailScanner::Log::InfoLog("CustomAction: $flag"); - Извиква функцията InfoLog от модула MailScanner::Log return unless $message; - "излиза" ако няма съобщение / undef или 0 / if ($yes_or_no =~ /y/) { - RegEXP - true ако стринга съдържа 'y' Долните вече трябва да са ти ясни. Края на модула трябва да завършва с нещо което е true , в случая 1 / Титла: Re: Perl, MailScanner, искам да го променя малко, ама не знам как :) Публикувано от: laskov в Apr 04, 2013, 14:33 OK! Благодаря много!
|