perl


ramok аватар

Случайная fork бомба

Делал простенький скрипт для преобразования ссылок с ютуба к нормальному виду. Команды замены взял из своих настроек urxvt в ~/.Xresources (в нём есть встроенный perl интерпретатор), сделав простенькую обвязку на perl

#/usr/bin/perl -CS 
 
$_ = $ARGV[0];
 
goto END if s,^(https?://(?:www\.)?youtube\.com/)[^ \n]*v[=\\/]([A-Za-z0-9_-]{11}).+?(t=\d+)[^ \n]*,$1watch?v=$2#$3$4,;
goto END if s,^(https?://(?:www\.)?youtube\.com/)[^ \n]*v[=\\/]([A-Za-z0-9_-]{11}).*,$1watch?v=$2,;
goto END if s,^https?://(?:www\.)?(?:youtu\.be/)([A-Za-z0-9_-]{11})$,http://www.youtube.com/watch?v=$1,;
goto END if s,^(https?://(?:www\.)?youtube\.com/)embed/([A-Za-z0-9_-]{11})[^ \n]*,$1watch?v=$2,;
 
exit;
 
END:
    print;

Внезапно всё начало тормозить. htop показал что скрипт воспроизводит себя с бешеной скоростью. Предлагаю сначала самостоятельно догадаться в чем дело :)

P.S.
Будьте осторожны с запуском. Предохраняйтесь :)

UPDATE:

0
Ваша оценка: Ничего
ramok аватар

Повторить символ заданное количество раз

Повторить символ заданное количество раз

$ printf 'A%.0s' {1..50}
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
$ perl -e 'print "A"x50'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
$ python -c 'print "A"*50'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
3.333335
Ваша оценка: Ничего Рейтинг: 3.3 (3 голоса)
ramok аватар

Кириллица в транслит

Перевести по быстрому кириллицу в транслит можно так

$ 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 библиотеке исходную кодировку, он берет текущую кодировку системы.

0
Ваша оценка: Ничего

urxvt выделение url

по дефолту в urxvt url в utf с русскими символами не выделяются
правим /usr/lib/urxvt/perl/matcher

меняем

a-zA-Z0-9

на

a-zA-Z\x{0410}-\x{044F}0-9

и все работает

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
ramok аватар

Удаление дубликатов в PATH (однострочник perl с объяснениями)

Уберет дубликаты из PATH

echo ${PATH}:/usr/bin | perl -aF: -ple'$_=join":",grep{!$o{$_}++}@F'
0
Ваша оценка: Ничего
ramok аватар

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

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

$ sudo dh-make-perl --install --cpan HTML::Template::Pluggable
0
Ваша оценка: Ничего
banda аватар

Как найти "счастливый билет"

"Счастливым" считается такой билет, в котором последовательное сложение цифр номера дает число 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
5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
ramok аватар

Модуль 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'
          };

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

0
Ваша оценка: Ничего
ramok аватар

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

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

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

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

for i in *.c; do
  mv $i `echo $i | sed 's/\.c$/.bak/'`
done
5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
ramok аватар

Решение задачи однострочником на 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

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

0
Ваша оценка: Ничего
ramok аватар

Решение задачи однострочником на 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.

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

0
Ваша оценка: Ничего
ramok аватар

Членопостроитель на основе 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"}'
0
Ваша оценка: Ничего
alexu аватар

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

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

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

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

0
Ваша оценка: Ничего
ramok аватар

Перевод шеснадцатиричного представления 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; 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. но это только смотреть, пайпы не пройдут Ж:-)
 

0
Ваша оценка: Ничего