perl

Изображение пользователя ramok.

Модуль perl для отладочного вывода сложных типов данных

Tags: •  • 

Если вы пишите на perl что нибуть сложнее однострочников, часто спасательным кругом становится модуль Data::Dumper.
Этот модуль очень полезен как для отладки и так и при разборе чужих программ и позволяет выводить содержимое любых сложных стукрур данных со всем их содержимым.

Например разбираемся в программе и видим что из модуля возвращается массив @data в котором находятся нужные нам данные.
Выводим его с помощью

use Data::Dumper;
print STDERR Dumper @data;

и видим что то типа
$VAR1 = {
          'TS' => '13550361229',
          'INDEX' => 1,
          'FL' => 1,
          'TD' => '73728',
          'DT' => 'addr'
        };
$VAR2 = {
          'TS' => '13550484957',
          'INDEX' => 2,
          'TD' => '82944',
          'FR' => 1,
          'DT' => 'mps'
        };
...
$VAR346 = { 
            'TS' => '13619541826',
            'INDEX' => 346,
            'TD' => '89088',
            'FR' => 1,
            'DT' => 'mps_ack'
          };

Ага. Сразу видно что это массив из хешей, и сразу видно и размер массива, и ключи в хешах и что по ним находится.

Изображение пользователя ramok.

Краткий справочник по массовому переименовыванию файлов :-)

Tags: •  •  •  •  •  • 

Иногда нужно производить массовые переименования файлов. Изучая командную строку юникса когда то, меня удивило отсутствие такой приятной возможности в DOS как массовые переименовывания файлов (помню было что то типа copy *.c *.bak).

1. По первому разу я просто в vi создавал множество команд mv производящие нужные действия. Самый очевидный, и самый трудоемкий путь Ж:-)

2. Позже я начал разбираться с командной строкой юникса и мог запрограммировать массовые переименования.

for i in *.c; do
  mv $i `echo $i | sed 's/\.c$/.bak/'`
done

Изображение пользователя ramok.

Решение задачи однострочником на perl 2

Tags: •  •  • 

Еще одна задачка с http://www.esci.ru/kcc2/kcc2_t.php

Quote:

Задачка 4
Всем известная финская полька настолько сложна для воспроизведения и
ввиду необычной музыки, и ввиду непривычного русскому уху финского
языка, что каждый поет ее по-разному. И несмотря на то, что нот всего
7, у каждого получается фальшивить по-своему. Однако, нельзя сказать,
что русские люди настолько уж лишены слуха, что вообще не попадают в
ноты. Нет, вместо <<до>> они могут спеть только <<ре>>, а на замену
<<фа>> может прийти только <<ми>> и <<соль>>. Т.е. не происходит ошибки
большей, чем на одну ноту. Во входном файле задан набор нот (латиницей,
через пробелы, не больше 50), выведите число вариантов, которым может
спеть финскую польку талантливый русский народ.

К примеру, мелодию do re можно спеть шестью вариантами: do do, do re,
do mi, re do, re re, re mi.

input:
do re

output:
6

input:
do re mi fa sol la si

output:
972

Решение:

$ echo "do re mi fa sol la si" |\
  perl -pe 's/(do|si)/2/g;s/[^\s\d]+/3/g;s/ +/*/g;s/.*/$&/ee'
972

Итак, разберемся..

Изображение пользователя ramok.

Решение задачи однострочником на perl. С объяснениями Ж:-)

Tags: •  •  • 

На сайте http://www.esci.ru/kcc2/kcc2_t.php есть любопытные задачки,
интересные для разминки и обучения Ж:-)

Процитирую одну, немного подправив:

Quote:

Задача 2.
Широко известно, что сотонинские заклинания надо произносить наоборот.
Юные сотонисты только недавно поступили в аццкую школу и до сих пор не
научились правильно читать наоборот. Им очень нужна программа, которая
бы из предложений делала предложения наоборот, сохраняя для удобства
классическую пунктуацию и заглавные буквы в начале предложений.

Все сотонинские заклинания состоят только из строчных и заглавных
латинских букв. пробелов и точек. Предложения всегда заканчиваются на
точку. Слова разделяются одним пробелом, точка ставится сразу после
буквы и после нее, если она не завершает всю фразу, ставится пробел.

input:
A beautiful new world. Come.
output:
Emoc. Dlrow wen lufituaeb a.

Сразу дам одно из решений, что бы напугать Ж:-) Решение

echo "A beautiful new world. Come." |\
  perl -pe '$_=lc;s/.\./uc $&/ge;$_=reverse;s/ \./. /g;s/^\W+(.*)/$1.\n/'
Emoc. Dlrow wen lufituaeb a.

И попробуем во всем этом разобраться..

Изображение пользователя ramok.

Создание .deb пакетов из perl модулей

Tags: •  •  •  • 

В репозитории Debian существует пакет dh-make-perl который может автоматически создавать пакеты .deb из модулей perl, при необходимости выкачивая их из CPAN. Срабатывает в основном для простых пакетов, но удобно для того что бы начать создавать пакет из модуля, так как программа берет на себя рутинную работу.

Изображение пользователя ramok.

Членопостроитель на основе uptime

Tags: •  •  • 

Просто незаменимый однострочкик на перле, для тех кто любит мерятся аптаймами Ж:-)

unido22pts/0~% uptime | perl -ne "/(\d+) d/;print 8,q(=)x\$1,\"D\n\""
8================================================================================
=================================================================================
=================================================================================
=================================================================================
=======================D
unido23pts/0~%

Версия для awk

$ uptime|awk '{while($3--)a=a"=";print 8a"D"}'

Изображение пользователя alexu.

Поиск и замена текста в нескольких файлах

Tags: •  •  •  •  • 

Чтобы заменить foo на bar в нескольких файлах, выполните следующую команду:

perl -pi~ -e 's/foo/bar/' [files]

Оригинальные файлы при этом будут сохраны с именами filename~

Изображение пользователя ramok.

Перевод шеснадцатиричного представления IP в стандартную форму в конс

Tags: •  •  •  •  •  •  •  •  • 

перевод hex IP -> dec IP

1) bash only by ams

$ i=ffffffc0; echo $((0x${i:0:2})).$((0x${i:2:2})).$((0x${i:4:2})).$((0x${i:6:2}))

2) так короче но $[] dericated

$ i=ffffffc0; echo $[0x${i:0:2}].$[0x${i:2:2}].$[0x${i:4:2}].$[0x${i:6:2}]

3) тоже вроде только для bash как имеющий опцию -n в read

$ echo ffffffc0 | while read -n 2 D; do [ -z $D ] || printf "%d." 0x$D; done; echo

4) sh+sed

$ printf "%d.%d.%d.%d\n" `echo ffffffc0 | sed 's/\(..\)\(..\)\(..\)\(..\)/0x\1 0x\2 0x\3 0x\4/'`

5) тоже но немного разбираясь в sed Ж:-)

$ printf "%d.%d.%d.%d\n" `echo ffffffc0 | sed 's/\(..\)/0x\1 /g'`

6) printf only by ams. но это только смотреть, пайпы не пройдут Ж:-)
[code]

RSS-материал