perl
Повторить символ заданное количество раз
Повторить символ заданное количество раз
$ printf 'A%.0s' {1..50} AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA $ perl -e 'print "A"x50' AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA $ python -c 'print "A"*50' AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Кириллица в транслит
Перевести по быстрому кириллицу в транслит можно так
$ echo Привет | iconv -t koi-7 | tr a-zA-Z A-Za-z
PriwetЕще один способ
$ echo Привет | perl -mText::Iconv -pe '$_=Text::Iconv->new("","koi-7")->convert($_);tr/A-Za-z/a-zA-z/'
PriwetФишка в том что кодировка koi-8 составлена так что бы при конвертации в koi-7 (путем обнуления старшего бита), каждая буква русского алфавита соответствовала схожей по произношению букве латиницы. 'а' => 'a', 'б' => 'b', 'в' => 'w' и так далее.
Другая особенность в том, что если не указать iconv библиотеке исходную кодировку, он берет текущую кодировку системы.
urxvt выделение url
по дефолту в urxvt url в utf с русскими символами не выделяются
правим /usr/lib/urxvt/perl/matcher
меняем
a-zA-Z0-9
на
a-zA-Z\x{0410}-\x{044F}0-9и все работает
Удаление дубликатов в PATH (однострочник perl с объяснениями)
Уберет дубликаты из PATH
echo ${PATH}:/usr/bin | perl -aF: -ple'$_=join":",grep{!$o{$_}++}@F'
Создание .deb пакетов из perl модулей
В репозитории Debian существует пакет dh-make-perl который может автоматически создавать пакеты .deb из модулей perl, при необходимости выкачивая их из CPAN. Срабатывает в основном для простых пакетов, но удобно для того что бы начать создавать пакет из модуля, так как программа берет на себя рутинную работу.
UPD:
Например:
$ sudo dh-make-perl --install --cpan HTML::Template::PluggableКак найти "счастливый билет"
"Счастливым" считается такой билет, в котором последовательное сложение цифр номера дает число 7. Например, 62431 -- номер "счастливого" билета (6 + 2 + 4 + 3 + 1 = 16, 1 + 6 = 7).
Можно найти такой билет для номера мобилы, аськ и т.п.
Набираем прямо из консоли и напишем результат в какой нибудь текстовый файл, например ~/bilets.txt
$ perl -e 'foreach (1000000..9999999){$t=$_;while(!/^.$/){s/\d/$&+/g;s/\+$//;$_=eval}print "$t\n" if $_ == 7}' > ~/bilets.txtМодуль perl для отладочного вывода сложных типов данных
Если вы пишите на 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'
};Ага. Сразу видно что это массив из хешей, и сразу видно и размер массива, и ключи в хешах и что по ним находится.
Краткий справочник по массовому переименовыванию файлов :-)
Иногда нужно производить массовые переименования файлов. Изучая командную строку юникса когда то, меня удивило отсутствие такой приятной возможности в DOS как массовые переименовывания файлов (помню было что то типа copy *.c *.bak).
1. По первому разу я просто в vi создавал множество команд mv производящие нужные действия. Самый очевидный, и самый трудоемкий путь Ж:-)
2. Позже я начал разбираться с командной строкой юникса и мог запрограммировать массовые переименования.
for i in *.c; do
mv $i `echo $i | sed 's/\.c$/.bak/'`
doneРешение задачи однострочником на perl 2
Еще одна задачка с http://www.esci.ru/kcc2/kcc2_t.php
Задачка 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
Итак, разберемся..
Решение задачи однострочником на perl. С объяснениями Ж:-)
На сайте http://www.esci.ru/kcc2/kcc2_t.php есть любопытные задачки,
интересные для разминки и обучения Ж:-)
Процитирую одну, немного подправив:
Задача 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.И попробуем во всем этом разобраться..
Членопостроитель на основе uptime
Просто незаменимый однострочкик на перле, для тех кто любит мерятся аптаймами Ж:-)
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"}'Поиск и замена текста в нескольких файлах
Чтобы заменить foo на bar в нескольких файлах, выполните следующую команду:
perl -pi~ -e 's/foo/bar/' [files]
Оригинальные файлы при этом будут сохраны с именами filename~
Перевод шеснадцатиричного представления IP в стандартную форму в конс
перевод 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; echo4) 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. но это только смотреть, пайпы не пройдут Ж:-)



