perl
Кажется, первый «родной» язык (не первый вообще, до того были кенгуренок и пылесосик1, а потом qbasic, но я никогда не воспринимала qbasic как прям свой удобный язык).
Осваивала в 2004 по Ламе. Ещё в винде - это был Activestate perl2. Писала полезняшки для себя и совсем изредка в рабочих целях. Даже возникала смешная (и неприятная, и лично мне невыгодная) ситуация, когда внезапно сделала всю работу, на которую меня брали. Совсем :)
Но сохранилось что-то мало.
perl -MCPAN -e shell
- получить оболочку для разговора со cpan.- -e - перловый однострок
- -i - редактировать «in place», после -i можно поставить хвост для бэкапления файлов, если нужны копии. Если в этом указанном будет *, она будет заменена на имя файла, а остальное - вокруг звёздочки, как указано.
- -n - обрабатывает файлы построчно
- -p - обрабатывает построчно и печатает
- -M - подключает модуль
Смотреть это всё подробнее и прочие плюшки запуска:
perldoc perlrun
- засунуть flame, по которому генерится картинка, в png - несделанное
- https://github.com/htrgouvea/zarn - штука для проверки безопасности. «Performing static analysis, Zarn is able to identify possible vulnerabilities: for this purpose, each file is parsed using AST analysis to recognize tokens that present risks and subsequently runs the taint tracking process to confirm that it is a whether exploitable or not, to validate whether a malicious agent is able to target the method in question.»
- https://www.reddit.com/r/perl/comments/17h4s39/zarn_a_lightweight_static_security_analysis_tool/ - мейби там будет полезное обсуждение, мейби нет.
- https://gist.github.com/joyrexus/7328094 – немного примеров одностроков.
- https://ivan.bessarabov.ru/blog/perl-oneliners - еще про ключи запуска и одностроки
- https://eax.me/perl-oneliners/
encode and decode url strings
URL addresses only accepts alphanumeric characters and some punctuation symbols, like parenthesis and underscore.
If you need to use any other symbol (like space) you have to URL encode it using a percent sign followed by the two hexadecimal digits that represents that digit in the ASCII table.
For example, the space symbol is character 32 (hexadecimal 20) in the ASCII table, so it's expressed as %20.
In Perl, the easiest way to URL encode a string is to use uri_escape() function from URI::Escape module. This function converts all the unsafe symbols of a string to its URL encode representation.
Conversely, uri_unescape() converts a URL encoded string to its normal representation.
#!/usr/bin/perl use URI::Escape; my $string = "Hello world!"; my $encode = uri_escape($string); print "Original string: $string\n"; print "URL Encoded string: $encode\n";
sha256
- sha1($data,…)
- This function will concatenate all arguments, calculate the SHA-1 digest of this ``message'', and return it in binary form.
- sha1_hex($data,…)
- Same as sha1(), but will return the digest in hexadecimal form.
- sha1_base64($data,…)
- Same as sha1(), but will return the digest as a base64 encoded string.
#!/usr/bin/perl use Digest::SHA qw(sha1); my $data="string"; print unpack("H*", sha1($data)), "\n";
или
#!/usr/bin/perl use Digest::SHA qw(sha1_hex); my $data="string"; print sha1_hex($data), "\n";
опции при запуске perl
Usage: perl [switches] [–] [programfile] [arguments] -0[octal/hexadecimal] specify record separator (\0, if no argument) -a autosplit mode with -n or -p (splits $_ into @F) -C[number/list] enables the listed Unicode features -c check syntax only (runs BEGIN and CHECK blocks) -d[t][:MOD] run program under debugger or module Devel::MOD -D[number/letters] set debugging flags (argument is a bit mask or alphabets) -e commandline one line of program (several -e's allowed, omit programfile) -E commandline like -e, but enables all optional features -f don't do $sitelib/sitecustomize.pl at startup -F/pattern/ split() pattern for -a switch (//'s are optional) -g read all input in one go (slurp), rather than line-by-line (alias for -0777) -i[extension] edit <> files in place (makes backup if extension supplied) -Idirectory specify @INC/#include directory (several -I's allowed) -l[octnum] enable line ending processing, specifies line terminator -[mM][-]module execute "use/no module…" before executing program -n assume "while (<>) { … }" loop around program -p assume loop like -n but print line also, like sed -s enable rudimentary parsing for switches after programfile -S look for programfile using PATH environment variable -t enable tainting warnings -T enable tainting checks -u dump core after parsing program -U allow unsafe operations -v print version, patchlevel and license -V[:configvar] print configuration summary (or a single Config.pm variable) -w enable many useful warnings -W enable all warnings -x[directory] ignore text before #!perl line (optionally cd to directory) -X disable all warnings
ссылки про сокеты
Специальные переменные для мэтчей
local $_ = 'abcdefghi'; /def/; print "$`:$&:$'\n"; # prints abc:def:ghi
Соответственно, часть строки до совпадения, совпадение, часть строки после.
Чтение файла
use Path::Tiny qw( path ); my $file = 'data.txt'; my $data = path($file)->slurp_utf8;
File::Slurper
Path::Tiny
Перлушка для превращения текста со всякими &xxx; и &#nnn; в нормальный utf8
Из моего же поста на welinux — http://welinux.ru/post/5018/
. Где тот Welinux, а текст остался.
#!/usr/bin/perl use HTML::Entities; binmode ("STDOUT", ":utf8"); print decode_entities(<>);
или почти то же однострочником от freefd:
perl -MHTML::Entities -e"use open ':locale'; print decode_entities <>"
Для превращения текста со всякими &xxx; и &#nnn; в обычный utf8. Понадобилось из-за штуки, которая в виде таких numeric character references и character entity references сохраняет всё, что не основные символы (латиница, цифры и что-то ещё по минимуму). Кириллицу, например.
- use HTML::Entities; — там сделали главную часть работы за меня :)
- binmode («STDOUT», «:utf8»); — чтобы Perl не ругался на необходимость печатать расшифрованное :)
- print decode_entities(<>); — читать справа налево. Берём нечто со stdin — <>. Превращаем в вид желаемый — decode_entities. И печатаем — print — на stdout.
Модуль HTML::Entities мне даже ставить не пришлось, в дебиане (сквизе) он в пакете libhtml-parser-perl, который был установлен по зависимостям к rss-читалке.
Советы по улучшению или замене на лучшее приму с благодарностью. :) Сделано было по принципу «лишь бы быстро справиться с задачей». Справилось.
В комментариях cblp подсказал неплохую штуку для перекодирования имён файлов — convmv.
Ссылки
- https://t.me/usePerlOrDie - о языке perl
- https://t.me/modernperl
- https://t.me/modernperl_flood - болталка.
- Preface(Modern Perl 2014) - http://modernperlbooks.com/books/modern_perl_2014/00-preface.html , https://github.com/timurn/modern_perl_book/tree/russian_translation
- Beginning Perl Programing with Emacs http://cpansearch.perl.org/src/YEWENBIN/Emacs-PDE-0.2.16/lisp/doc/QuickStartEn.html
- https://en.wikipedia.org/wiki/Perl_module - на удивление милое описание про модули.
- https://en.wikipedia.org/wiki/Category:Perl
- https://perlmaven.com/perl-tutorial
- https://perlmaven.com/dancer - про Dancer мне интересно отдельно.
- https://stackoverflow.com/questions/13631915/execute-perl-in-emacs-most-basic
- http://obsidianrook.com/devnotes/elisp-for-perl-programmers.html
- https://perldoc.perl.org/
- https://perlmonks.org
- https://www.reddit.com/r/perl/
Тип, что нужно для хорошего коду
Не сохранила, откуда прихватила.
- Perl Best Practices
- Perl::Tidy
- POD
- Perl::Critic https://perlmaven.com/perl-critic
- Test::*
- Devel::Cover
- http://oreilly.com/catalog/9780596001735
- http://search.cpan.org/dist/Perl-Tidy/
- http://www.literateprogramming.com/knuthweb.pdf
- http://www.pm.org/faq/ - Perl Mongers Frequently Asked Questions. Это про группы перловщиков.
Сноски:
https://pandia.ru/text/78/398/80755.php или https://ikt-det.jimdofree.com/%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B8%D0%BA%D0%B0/%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D0%B8/%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C-%D0%BA%D0%B5%D0%BD%D0%B3%D1%83%D1%80%D0%B5%D0%BD%D0%BE%D0%BA/