Показаны сообщения с ярлыком perl. Показать все сообщения
Показаны сообщения с ярлыком perl. Показать все сообщения

вторник, 11 сентября 2012 г.

Код завершения 153

Несколько программ периодически стали завершаться с кодом возврата 153.

Оказалось, что это зарезервированный код и соответствует завершению по 25-му сигналу (153-128=25).

Коды сигналов обнаружились в /usr/include/asm-x86/signal.h Сигналом оказался SIGXFSZ, посылаемый процессу при превышении открытым файлом максимально допустимого размера.

среда, 25 апреля 2012 г.

Поиск повторов в текстовых файлах

Нужно найти пересечения текстовых файлов (ранее были xls) по части строки - так называемому идентификатору. Повторы одного и того же идентификатора в разных файлах помог скрипт:

#!/bin/sh

ls *csv | while read FNAME
do
  grep -v "Дата отп." $FNAME | perl -pe 's#^.*(<.+\d+>).*$#$1#' > list;
  cat list | while read LINE; do grep "$LINE" *csv; done | grep -v "$FNAME";
done


"Дата отп." - регулярное выражение для отбрасывания лишних строк, например заголовков повторяющихся в каждом файле,
's#^.*(<.+\d+>).*$#$1#' - регулярное выражение, для извлечения из строки идентификатора, в данном случае ищем что-то вроде <... 123456>.

Выгрузка xls-файлов в csv

Ну и запросы у вас...

Необходимо преобразовать несколько сотен xls файлов в формат csv. Исходные файлы имеют по несколько листов и эти листы желательно объединить и сохранить в один csv.

  1. Устанавливаем xls2csv
  2. В каталоге с исходными файлами запускаем скрипт:

    #!/bin/sh
    for i in `ls *xls`
    do
      echo convertxls2csv -x "$i" -b WINDOWS-1251 -a UTF-8 -c "$i".csv;
      convertxls2csv -x "$i" -b WINDOWS-1251 -a UTF-8 -W | grep -v "Now reading" | grep -v "The following" > sheet
      cat sheet | while read SHEET
      do
        convertxls2csv -x "$i" -b WINDOWS-1251 -a UTF-8 -w "$SHEET" -c tmp.csv;
        cat tmp.csv >> "$i".csv;
      done
    done
    rm tmp.csv;
  3. В результате получаем файлы с именами вида *.xls.csv в которые выгружены все листы исходных *.xls

вторник, 5 мая 2009 г.

LWP: ошибка при использовании NTLM

При использовании пакета LWP для запроса страницы требующей авторизации NTLM (LWP::Authen::Ntlm) возникла ошибка:
Client-Warning: Unsupported authentication scheme 'ntlm'
С ошибкой помог справится r1mson: для этого потребовалось установить модуль Authen::NTLM.
Данный модуль не устанавливается при установке LWP::Authen::Ntlm с помощью MCPAN, но упоминание о нём есть в документации к LWP::Authen::Ntlm:
The module takes advantage of the Authen::NTLM module by Mark Bush. Since there is also another Authen::NTLM module available from CPAN by Yee Man Chan with an entirely different interface, it is necessary to ensure that you have the correct NTLM module.
По умолчанию был установлен модуль от Марка Буша, собственно он и рекомендуется:
perl -MCPAN -e 'install Authen::NTLM'

четверг, 16 апреля 2009 г.

Обработка в perl массива строк с использованием операторов map и s///

Задача: используя операторы map и s/// обработать массив строк согласно заданному регулярному выражению.

Конструкция будет иметь следующий вид:
map {$_ =~ s/^\s*(\S+\s+\d+)\s+\d+\s+\S+/$1/; $_} @test
или в общем виде:
map {$_ =~ s/reg//; $_} @test
Источник: mailman.linuxchix.org.

пятница, 23 января 2009 г.

escape() и Perl

Одноимённые функции escape() в Javascript и Perl символы в utf8 кодируют по разному. Первая представляет символы в формате %uXXXX, вторая - %XX.

Помог пакет URI::Escape::JavaScript, за что большое спасибо Koichi Taniguchi.

К приведённому в документации примеру достаточно добавить только "use encoding 'utf-8'":
use encoding 'utf-8';
use URI::Escape::JavaScript qw(escape unescape);

$string = "\x{3084}\x{306f}\x{308a}\x{539f}\x{56e0}\x{306f} Yapp(ry";
$escaped = escape($string);

$escaped = '%u30B5%u30D6%u30C6%u30AF%u5165%u308A%u305F%u3044%uFF01%uFF01';
$string = unescape($escaped);

воскресенье, 30 ноября 2008 г.

Как установить CPAN

Сегодня пришлось вспомнить как установить модуль perl без использования CPAN.
В списке модулей на search.cpan.org найти CPAN, скачать и распаковать архив.

Для установки последовательно выполняем:
$ perl Makefile.PL (подготовка к установке)
$ make (компиляция)
$ make test (проверка)
$ make install (установка модуля)

понедельник, 20 октября 2008 г.

UTF-8 и Perl

Есть работающая программа. Долгое время она писала в журналы: Wide character in print at module.pl line NNN. Если верить ошибке, то на выходе должна была быть смесь UTF-8 и ISO-8859-5, но реально был только ISO. При просмотре кода оказалось, что строки, распечатываемые в print содержат UTF-8, а STDOUT переопределён и перекодируется с помощью iconv:
open(STDOUT, "| iconv -f $codexml -t $codepage");
select(STDOUT); $| = 1;

Убрал переопределение STDOUT, добавил рекурсивное перекодирование структуры - теперь можно наслаждаться пустыми логами.

P.S. Если из строки нужно убрать лишние (или служебные) символы вывод которых вызывает предупреждение "Wide character in print", то для этих целей можно использовать:
$value =~ s/[^[:ascii:]]+//g;