Говорят, perl’у исполнилось 25 лет..
Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.
Говорят, perl’у исполнилось 25 лет..
Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.
Из любимого юмористического сообщества ru_php я сегодня узнал, что в PHP логические операторы “and” и “or” имеют гораздо более низкий приоритет, чем “&&” и “||”.
Каково же было моё удивление, когда я обнаружил, что и в перле дело обстоит точно так же. То есть, 1 and 1 || 0 and 0
— это вовсе не то же самое, что 1 and 1 or 0 and 0
.
Я, правда, or применял исключительно в конструкциях “foo() or die()”, поэтому на эти грабли ни разу не наступил. Но это ж надо было ТАКОЕ придумать..
Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.
Возникла у меня тут необходимость запускать gpg в пакетном режиме, без взаимодействия с пользователем. Точнее, пользователь должен один раз ввести пароль от ключа, и больше не вмешиваться.
Нашел модуль GnuPG, но оказалось, что он полагается на shared memory, а в нынешнем gpg2 эта фича не поддерживается. Теперь надо а gpg все дополнительные данные скармливать через файловые дескрипторы. Пробую запустить из комнадной строки:
/usr/bin/gpg --decrypt --batch --passphrase-fd 3 encrypted.file 3<password.file
Работает. Ну ладно, будем запускать то же самое из перла, только без файла, а напрямую скармливая пароль через пайп.
В целом вроде бы тоже работает, gpg запускается, зашифрованный файл находит, даже показывает, каким ключом он зашифрован, но… расшифровать не может, поскольку не видит пароля:
can't connect to `/home/dil/.gnupg/S.gpg-agent': No such file or directory
gpg: encrypted with 2048-bit RSA key, ID 673056FF, created 2012-02-17
"юзер <почтовый адрес>"
gpg: public key decryption failed: Bad passphrase
gpg: decryption failed: No secret key
Пробую напечатать пароль непосредственно в перле из дочернего процесса, прочитав его из пайпа. Нормально читается и печатается. А gpg из того же пайпа этот пароль в упор не видит.
Вопрос для продвинутых программистов и сисадминов: где засада?
Подсказка: проблема решилась после добавления в скрипт пары строчек. Угадайте, каких.
Исходник на перле под катом.
( Read the rest of this entry » )Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.
Перенесли тут как-то перловый скриптик на другую машину. А он возьми да и сломайся. И пошёл я смотреть, отчего это. Ругался он при попытке распарсить XML-файл (да-да, тем самым XML::XPath->new(), про который был предыдущий пост) но ругался довольно странно:
error in processing external entity reference at line 2, column 58, byte 80:
<?xml version="1.0"?>
<!DOCTYPE DataAlertService SYSTEM "DataAlertService.dtd">
=======================================================^
Потратив всего каких-то полдня, я понял, что ругается он вовсе не на указанное место, и даже не на сам этот XML. А на DTD. Потратив ещё полдня, я понял, что на этой машине XML-парсер тупо не понимает parameter entities в DTD.
Это макросы типа <!ENTITY % id 'id CDATA #REQUIRED'>
, которые потом можно в том же DTD использовать: <!ATTLIST Official %id; ...
Вот на прежней древней солярке понимал, на моей десктопной убунте понимает, а на этой грёбанной CentOS (5.5, последний релиз, все дела) – не понимает. И после этого мне ещё будут рассказывать о прелестях этих ваших редхатов..
Оригинал этой записи. Комментировать можно тут или там.
А сегодня ночью один скриптик перловый, запускаемый из крона, не отработал. Бывает. Ну я его перезапустил. А он чего-то думает долго. Минут через десять мне надоело ждать и я посмотрел в код. А там ТАКОЕ… что прям хоть целиком в code_wtf отправляй.
Оригинал этой записи. Комментировать можно тут или там.
На сей раз в перловом Sendmail::Milter.
auto_getconn некорректно извлекает из sendmail.cf название сокета. Из
Xantispam, S=local:/var/run/antispam.sock,F=T,T=C:1s;S:10s;R:10s;E:30s
вместо
local:/var/run/antispam.sock
извлекается
local:/var/run/antispam.sock,F=T.
Патамушта аффтар ниасилил non-greedy matching. Модуль последний раз менялся аж в 2001 году. За 8 лет бага никто не заметил..
Никому нельзя доверять, всё надо писать самому :(
Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.
А что, этот вот масон – хорошая штука? Стоит тратить время на изучение, или с тех пор прогрессивное человечество придумало что-нибудь принципиально лучшее в области фреймворков для веба на перле?
Оригинал этой записи. Комментировать можно тут или там.
#!/usr/bin/perl -w
my $foo = "\x47";
for(my $i=7;$i>=0;$i--){
print vec($foo, $i, 1)." ";
}
print "\n";
my @a = unpack("C*", $foo);
printf("0x%x\n", $a[0]);
for(my $i=7;$i>=0;$i--){
print vec($a[0], $i, 1)." ";
}
print "\n";
if (!$1 || !$2 || !$3) { log_msg <<END; Malformed regular expression "$regexp": did not get expected matches for time- stamp, name and elapse-time. END }
$forever = "forever"; while ($forever eq "forever") { ...
if ($username eq "") { exit; } if ($username eq "") { ... } else { ...
#!/usr/bin/perl -w
use SOAP::Lite +trace => "debug";
my $service = SOAP::Lite
-> service('http://...');
$service->envprefix('SOAP-ENV');
my $r = $service->Version();