Хабрахабр: Метки / perl: Вышел Perl 5.40
В начале июня 2024 года состоялся релиз стабильной ветки языка программирования Perl 5.40. Релиз предыдущей стабильной ветки проекта Perl 5.38 состоялся в июле 2023 года.
Читать далее
В начале июня 2024 года состоялся релиз стабильной ветки языка программирования Perl 5.40. Релиз предыдущей стабильной ветки проекта Perl 5.38 состоялся в июле 2023 года.
Читать далееПосле 11 месяцев разработки опубликован релиз новой стабильной ветки языка программирования Perl - 5.40. При подготовке нового выпуска было изменено около 160 тыс. строк кода (без документации и автоматически сгенерированного кода - 110 тысяч), изменения затронули 1500 файлов, в разработке приняли участие 75 разработчиков.
В Perl-модуле Spreadsheet::ParseExcel, предоставляющем функции для разбора файлов в формате Excel, выявлена критическая уязвимость (CVE-2023-7101), позволяющая выполнить произвольный код при обработке файлов XLS или XLSX, включающих специально оформленные правила форматирования чисел. Уязвимость вызвана использованием при построении вызова "eval" данных, полученных из обрабатываемого файла. Проблема устранена в обновлении Spreadsheet::ParseExcel 0.66. Имеется прототип эксплоита.
В начале июля 2023 года состоялся релиз стабильной ветки Perl 5.38 с поддержкой классов. Примерно через месяц планируется выпустить первый корректирующий релиз Perl 5.38.1. Одновременно с выходом Perl 5.38 разработчиками прекращена поддержка ветки 5.34, для которой в будущем могут быть выпущены обновления только в случае выявления критических проблем с безопасностью. Также начался процесс разработки экспериментальной ветки 5.39, на базе которой в начале лета 2024 года будет сформирован стабильный релиз Perl 5.40, если сообществом не будет принято решение перейти к нумерации 7.x.
Читать далееПосле 13 месяцев разработки опубликован релиз новой стабильной ветки языка программирования Perl - 5.38. При подготовке нового выпуска было изменено около 290 тыс. строк кода, изменения затронули 1500 файлов, в разработке приняли участие 100 разработчиков.
Не Литкодом единым, как говорится! Нашёл на диске пару задачек с HackerRank – видимо, показались тогда особо любопытными, и были сохранены.
Впрочем, и сейчас они выглядят интересно. Эта, например (первая из них) – перемещение паттерна в виде “песочных часов” по “игровому полю”, представленному матрицей, с целью найти такой паттерн, сумма цифр в котором будет максимальной.
Здесь у меня получилось два решения – частное (на Java) и общее (на Perl).
Решение для паттерна и поля, указанных в задаче. Т.е. поле размером 6х6
и часики с внешним габаритом 3х3
.
import java.util.Arrays;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[][] arr = new int[6][6];
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
arr[i][j] = in.nextInt();
}
}
System.out.println(solve(arr));
}
private static int solve(int[][] arr) {
int[] sum = new int[16];
int h = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
sum[h] = arr[i][j] + arr[i][j + 1] + arr[i][j + 2]
+ arr[i + 1][j + 1]
+ arr[i + 2][j] + arr[i + 2][j + 1] + arr[i + 2][j + 2];
h++;
}
}
Arrays.sort(sum);
return sum[sum.length - 1];
}
}
Здесь уже можно задать в скрипте габариты паттерна “часов” и подать на вход матрицу произвольного размера (конечно, с учётом того, что паттерн должен в ней помещаться).
#!/usr/bin/env perl
require 5.008_008;
use warnings;
use strict;
use utf8;
# hourglass dimensions, min 3x3
my $hg_dim = {
'x' => 3, # width, must be odd
'y' => 3, # height
};
$hg_dim->{wdht} = $hg_dim->{x} - 1; #i
$hg_dim->{hght} = $hg_dim->{y} - 1; #j
$hg_dim->{cntr} = sprintf("%u", $hg_dim->{x} / 2);
my $arr = [];
while (<STDIN>) {
chomp;
push @{$arr}, [ split(' ', $_) ];
}
# ...or $#{$arr-$hg_dim-1>[0]}+1 - $hg_dim-1
my $max_x = (scalar @{$arr->[0]}) - ($hg_dim->{wdht});
my $max_y = (scalar @{$arr}) - ($hg_dim->{hght});
# for neg nums, or add $sum on array and sort it
my $max_sum = -1000;
for (my $y = 0; $y < $max_y; $y++) {
for (my $x = 0; $x < $max_x; $x++) {
my $sum = 0;
for (my $i = $x; $i <= $x + $hg_dim->{wdht}; $i++) {
$sum += $arr->[$y]->[$i]; # upper row
$sum += $arr->[$y + $hg_dim->{hght}]->[$i]; # lowest row
}
for (my $j = $y + 1; $j < $y + $hg_dim->{hght}; $j++) {
$sum += $arr->[$j]->[$x + $hg_dim->{cntr}]; # column
}
$max_sum = ($sum > $max_sum) ? $sum : $max_sum;
}
}
print $max_sum, $/;
В итоге – оба приведённых решения работают, причём – по сию пору. Это отрадно По традиции – они же выложены на GitHub.
https://www.hackerrank.com/challenges/30-2d-arrays/problem
Представлен выпуск Rakudo 2023.04, компилятора для языка программирования Raku (бывший Perl 6). Проект был переименован из Perl 6 так как не стал продолжением Perl 5, как ожидалось изначально, а превратился в отдельный язык программирования, несовместимый с Perl 5 на уровне исходных текстов и развиваемый отдельным сообществом разработчиков. Компилятор поддерживает варианты языка Raku, описанные в спецификациях 6.c, 6.d (по умолчанию). Одновременно доступен выпуск виртуальной машины MoarVM 2023.04, формирующей среду для запуска скомпилированного в Rakudo байт-кода. В Rakudo компиляция также поддерживается для JVM и некоторых виртуальных машин для JavaScript.
Представлен выпуск Rakudo 2022.12, компилятора для языка программирования Raku (бывший Perl 6). Проект был переименован из Perl 6 так как не стал продолжением Perl 5, как ожидалось изначально, а превратился в отдельный язык программирования, не совместимый с Perl 5 на уровне исходных текстов и развиваемый отдельным сообществом разработчиков. Компилятор поддерживает варианты языка Raku, описанные в спецификациях 6.c, 6.d (по умолчанию). Одновременно доступен выпуск виртуальной машины MoarVM 2022.12, формирующей среду для запуска скомпилированного в Rakudo байт-кода. В Rakudo компиляция также поддерживается для JVM и некоторых виртуальных машин для JavaScript.
Представлен выпуск Rakudo 2022.06, компилятора для языка программирования Raku (бывший Perl 6). Проект был переименован из Perl 6 так как не стал продолжением Perl 5, как ожидалось изначально, а превратился в отдельный язык программирования, не совместимый с Perl 5 на уровне исходных текстов и развиваемый отдельным сообществом разработчиков. Компилятор поддерживает варианты языка Raku, описанные в спецификациях 6.c и 6.d (по умолчанию). Одновременно доступен выпуск виртуальной машины MoarVM 2022.06, формирующей среду для запуска скомпилированного в Rakudo байт-кода. В Rakudo компиляция также поддерживается для JVM и некоторых виртуальных машин для JavaScript.
После года разработки опубликован релиз новой стабильной ветки языка программирования Perl - 5.36. При подготовке нового выпуска было изменено около 250 тыс. строк кода, изменения затронули 2000 файлов, в разработке приняли участие 82 разработчика.
Управляющий совет проекта Perl обобщил планы по дальнейшему развитию ветки Perl 5 и созданию ветки Perl 7. В ходе дискуссий управляющий совет согласился, что недопустимо нарушать совместимость с уже написанным для Perl 5 кодом, за исключением.
Представлен выпуск Rakudo 2022.02, компилятора для языка программирования Raku (бывший Perl 6). Проект был переименован из Perl 6 так как не стал продолжением Perl 5, как ожидалось изначально, а превратился в отдельный язык программирования, не совместимый с Perl 5 на уровне исходных текстов и развиваемый отдельным сообществом разработчиков. Одновременно доступен выпуск виртуальной машины MoarVM 2022.02, формирующей среду для запуска скомпилированного в Rakudo байт-кода. В Rakudo компиляция также поддерживается для JVM и некоторых виртуальных машин для JavaScript.
Представлен выпуск Rakudo 2021.12, компилятора для языка программирования Raku (бывший Perl 6). Проект был переименован из Perl 6 так как не стал продолжением Perl 5, как ожидалось изначально, а превратился в отдельный язык программирования, не совместимый с Perl 5 на уровне исходных текстов и развиваемый отдельным сообществом разработчиков. Одновременно доступен выпуск виртуальной машины MoarVM 2021.12, формирующей среду для запуска скомпилированного в Rakudo байт-кода. В Rakudo компиляция также поддерживается для JVM и некоторых виртуальных машин для JavaScript.
Когда-то я был впечатлён периодической таблицей операторов perl6. Однако для perl такую таблицу делать не спешат.
Представляю Вашему вниманию свою разработку.
Читать далее
В очередной раз задумался о том, какие строки оптимальней использовать в основном коде: characters или octets.
Обычно мне очень редко приходиться работать непосредственно с unicode. Когда нужно, я преобразовываю octets в characters, а затем обратно.
Но HTML::Parser требует на вход unicode, и JSON::XS корректно работает только с unicode. Поэтому хоть непосредственно я сам не использую characters, приходиться перекодировать при помощи модуля Encode.
Кроме этих модулей, обычно все работают с octets.
А вот при работе над магазинчиком вышивки бисером и нитками Embroidery Kits выяснилось, что остальные используемый модули могут работать как с octets, так и с characters (кроме Digest::SHA).
HTML::Parser и JSON::XS перетянули одеяло на себя. Задумался.
P.S.
Utf8 флаг в сложных структурах данных расставляю, сбрасываю при помощи нижеприведенного кода.
use Encode; use Scalar::Util qw(looks_like_number);sub data_walk($$); sub data_walk($$) { my ($d,$s) = @_; if (ref $d eq "ARRAY") { $d = [ map { data_walk($_, $s) } @$d ]; } elsif (ref $d eq "HASH") { $d = { map { $s->($_) => data_walk($$d{$_}, $s) } keys %$d }; } elsif (not ref $d) { $d = $s->($d) } return $d; }
sub data_encode_utf8 { data_walk(shift, sub { my $data = shift; if ($data and not looks_like_number($data)) { $data = Encode::encode_utf8($data) if Encode::is_utf8($data); } return $data; } ) }
sub data_decode_utf8 { data_walk(shift, sub { my $data = shift; if ($data and not looks_like_number($data)) { $data = Encode::decode_utf8($data, Encode::FB_QUIET) unless Encode::is_utf8($data); $data ||= "ERROR: FOR SOME REASON, TEXT CONVERSION TO UTF8 FAILED"; } return $data; } ) }
Наткнулся на gihub на использование оператора //= Ни разу раньше не видел его использования.
К сожалению, сам не нашел мануал, что он означает и тестами до конца не понял . По тестам вижу, что в отличие от ||= проверяет переменную на определенность, а не ложь/истина. Но у меня работает это с числами, а со строками после операции получаю undef.
Можете подсказать, что делает этот оператор присваивания?
Брайан Фой, эксперт по Perl, сообщил, что домен сайта Perl.com был захвачен неизвестными хакерами.
Он опубликовал сообщение на Reddit: «Мы все еще пытаемся разобраться, и я не могу вдаваться в подробности. Однако, похоже, что это был взлом аккаунта».
Читать далее
Чем дальше в сторону от веба, тем более комьюнити в перле какие-то чудаки на плохую букву.
На столько часто сталкиваюсь с этим в последнее время, что всерьез начинаю думать о смене религии на питон.
Такие дела.
Опять же, к чему угодно современному на питоне биндинги сейчас отличные есть, а под перл если и напишут вообще - исключительно странное и с своеобразной документацией.
Недавно я увидел весьма интересную статью - Perl is Dead. Python is the New Java. В тексте много спорного, включая вставку про отладку, в которой слишком много фанатизма, но идея в заголовке, вполне возможно, и даже вероятно, сейчас правильная.
Мне последнее время приходится немножко читать/писать на питоне и я нахожу весьма удивительным, что при общей похожести очень многие вещи в нем принято делать значительно иначе и совсем не так, как в перле, и какая-либо совместимость для, например, миграции отсутствует напрочь. Это весьма неудобно - мне как раз приходится какие-то вещи переписывать с питона на перл, и другие вещи, наоборот, с перла на питон.
Например, для традиционных pack/unpack и printf/sprintf используются совершенно разные шаблоны (т.е. при одном и том же значении буквы в шаблонах отличаются полностью и означают совсем другое), причем перловый вариант, кажется, примерно полностью совпадает с классическим Си.
При этом printf/sprintf в чистом виде в питоне как бы отсутсвует, а для паддинга строк, например, видимо принято делать str(...).zfill(...).
Надо признать, что это и многое другое в питоне начинает казаться значительно более юзерфрендли, чем в перле. Серьезно, невозможно помнить наизусть шаблоны для pack/unpack и printf/sprintf, если не пишешь что-то с ними каждый день, в то время как, наример, str(...).zfill(...), наоборот - невозможно забыть.
Любопытно и то, что в Raku, судя по всему, подобные неинтуитивности исправлены.
Git умеет «из коробки» раскрашивать то, что выводит в консоль, а Subversion — нет. Надоело руками каждый раз перенаправлять вывод svn diff в colordiff — написал простенькую раскрашивалку. Когда-то умела красить только вывод подкоманды status, теперь понимает blame (praise, annotate, ann), diff (di), help (?, h), status (stat, st) — и сами подкоманды, и их синонимы.
https://github.com/shoorick/svn-st-color
Выложил в github в public проект stdin2news . Для unix way ftn с фидогейтом, ньюзсервером и прочими печеньками. :) в гугле: "grey-olli stdin2news github" , прямой линк: https://github.com/grey-olli/stdin2news
Открытие дня, цитирую:
To people wondering why this syntax persisted so long: the bug produced by this syntax was actually the only way to have state variables, before the keyword state
was introduced. This is why the bug was not fixed. Some people actually used it as a short syntax to implement a state variable:
$ perl -E 'sub flip_flop { my $t if 0; $t = !$t; say $t ? "flip" : "flop"} flip_flop() for 1..4'
flip
flop
flip
flop
https://dev.to/dams/comment/c3mi
А мне то казалось, что так просто код выглядит читабельнее в ряде случаев...
Rate Tree Gumbo pure Gumbo Gumbo cb SAX Tree 46/s -- -63% -72% -80% -87% Gumbo pure 122/s 167% -- -24% -47% -64% Gumbo 161/s 252% 32% -- -30% -53% Gumbo cb 230/s 403% 89% 43% -- -32% SAX 339/s 642% 178% 111% 47% --
SAX - это HTML::Parser Tree - HTML::TreeBuilder Gumbo - HTML::Gumbo with tree output format Gumbo cb - HTML::Gumbo with callback output format
есть ли какие нибуть облачные провайдеры поддерживающие cloud function на perl ?
(запуск perl через nodejs не предлагать)
нашел тут «готовый» компилятор — вдруг сгодится чтоб не писать компилятор с php
— кто пользуется?
— оно вообще рабочее? (судя по датам релизов около 9 лет уже пилят)
— насколько адекватный код получается — опять эмуляция perl рантайма или нормальный перевод на java типы и классы?
надо распарсить код типизированного класса на PHP 7 и сконвертировать в java (или в идеале в С++)
тоесть на уровне ограниченного ООП синтаксиса (без учета существования классов и методов библиотек)
на входе синтаксически корректный файл с классом на PHP на выходе синтаксически корректный файл с классом на java
Из перлового веб-фреймворка Mojolicious начиная с вышедшей ровно четыре месяца назад версии 8.0 убрана команда test
Теперь вместо этой команды надо использовать prove.
http://shoorick.ru/2019/01/15/mojo-no-test/
Перловый микрофреймворк Mojolicious::Lite умеет сам выдавать существующие файлы, но при этом не все из них получают верный тип содержимого Content-type
: некоторые файлы прикидываются обычными текстовыми (text/plain
), другие же вообще не имеют никакого типа — браузер такие файлы может воспринимать как угодно. В состав фреймворка входит модуль Mojolicious::Types, в котором определены MIME-типы для наиболее популярных (most common) расширений файлов:
appcache -> text/cache-manifest atom -> application/atom+xml bin -> application/octet-stream css -> text/css gif -> image/gif gz -> application/x-gzip htm -> text/html html -> text/html;charset=UTF-8 ico -> image/x-icon jpeg -> image/jpeg jpg -> image/jpeg js -> application/javascript json -> application/json;charset=UTF-8 mp3 -> audio/mpeg mp4 -> video/mp4 ogg -> audio/ogg ogv -> video/ogg pdf -> application/pdf png -> image/png rss -> application/rss+xml svg -> image/svg+xml txt -> text/plain;charset=UTF-8 webm -> video/webm woff -> font/woff woff2 -> font/woff2 xml -> application/xml,text/xml zip -> application/zip
---
# ... ещё какие-нибудь параметры
# MS Office types
types:
rtf: application/rtf
doc: application/msword
dot: application/msword
docx: application/vnd.openxmlformats-officedocument.wordprocessingml.document
$config
)
while ( my ( $ext, $type ) = each %{ $config->'types' } ) {
app->types->type($ext => $type);
}
undef
my $type = $self->app->types->mapping->$ext->[0];
if (my $asset = $self->app->static->file("/$path/$id.$ext")) {
$self->res->headers->content_type($type);
return $self->reply->asset($asset);
}
else {
return $self->reply->not_found;
}
В состав перлового микрофреймворка Mojolicious::Lite входит класс Mojo::Log, который не просто пишет сообщения в лог, а ещё и учитывает важность сообщений — в отладочном режиме пишет много, а боевом — мало. Обнаружилось, что сообщения об ошибках имеют тот же класс debug
, что и остальные сообщения
[Tue Nov 13 12:25:51 2018] [debug] Format html [Tue Nov 13 12:25:51 2018] [debug] 200 OK (0.076118s, 13.137/s) [Tue Nov 13 12:25:53 2018] [debug] GET "/some/url" [Tue Nov 13 12:25:53 2018] [debug] Template "not_found.development.html.ep" not found [Tue Nov 13 12:25:53 2018] [debug] Rendering template "not_found.html.ep" [Tue Nov 13 12:25:53 2018] [debug] Rendering template "layouts/error.html.ep" [Tue Nov 13 12:25:53 2018] [debug] Rendering cached template "layouts/admin.html.ep" [Tue Nov 13 12:25:53 2018] [debug] Rendering cached template "search_form_navbar.html.ep" [Tue Nov 13 12:25:53 2018] [debug] Format html [Tue Nov 13 12:25:53 2018] [debug] 404 Not Found (0.004841s, 206.569/s)
hook after_dispatch => sub {
my $self = shift;
my $req = $self->req;
my $res = $self->res;
if ( $res->code >= 400 ) {
$self->app->log->error(join ' ',
'"' . $req->method . ' ' . $req->url . '"',
$res->code,
$req->headers->referrer
);
}
};
Sending children hup signal [Tue Nov 13 12:30:46 2018] [error] "GET /none" 404 - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" [Tue Nov 13 12:44:50 2018] [error] "GET /SW/Rplayer.html" 404 - "Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +http://go.mail.ru/help/robots)"
Есть ненулевая вероятность того, что приближающийся 2019 год будет для моей семьи не таким, как сейчас и я в силу разных причин не смогу быть там, где сначала лет пять играл и слегка учился, потом ещё пять серьёзно учился и слегка работал, а потом ещё почти двадцать серьёзно работал — в крупнейшем на ближайшие несколько областей университете. Я, конечно, последние несколько лет стараюсь достаточно подробно документировать рабочие процессы и коллеги, надеюсь, разберутся, но лучше бы найти ещё кого-то вместо себя, чтобы хозяйство не развалилось без присмотра.
Итак, нам нужен программист. Живьём на полный рабочий день (понедельник—пятница с 8:30 до 17). Требования и пожелания:
Документация по языку Perl и его модулям теперь доступна и на perldoc.pl, только оно без прокси не работает, ибо заблокировано роскомпозором. Точнее, заблокирован IP-адрес (IPv4, конечно), на котором сидит этот сайт. И lilypond.org без прокси не откроется, и toggl.com, и oEmbed.com...
Попробовал решить одну из рабочих задач, применив нелюбимый язык PHP в комплекте с современными инструментами — получилось близко к тому, что делал сравнительно недавно на перле, с некоторыми отличиями:
http::tiny зависит от Net::SSLeay - который бинарный
пока использую консольную утилиту curl
формат файла .env обычный, например:
DEPLOY_DB="test1"
DEPLOY_USER="111"
DEPLOY_PASSWORD="111"
есть какойто модуль чтоб загрузить файл и переменные получить в скрипте perl в $ENV['DEPLOY_DB'] и т.д.
или это можно сделать средствами perl?
Мы стали более лучше одеваться^W^W^W правильнее склонять имена с фамилиями. Вчера вышла свежая версия предназначенного для этого перлового модуля Lingua::RU::Inflect (он же есть и на гитхабе — чуть свеже́е, чем на CPAN).
На днях по рабочей необходимости сгенерировал родительный падеж более, чем на четырёх тысячах реальных имён — почти один процент из них оказался с ошибками — пришлось исправить модуль, за который я четыре года не брался.
Итак, в новой версии:
use Lingua::RU::Inflect ':all'
— компилятор теперь не ругается на попытку экспортировать функции, убранные в другой модуль.
есть ли? — чтоб ставил в локальную папку проекта и подключая некий autoloader-файл в скрипте я мог использовать модули без необходимости установки через cpan и т.п.?
т е деплой осуществляется просто копированием на систему с установленным perl определенной версии и стандартными модулями
как проверить что модуль бинарный (чтото компилирует ) ?
например мне нужны модули реализованые на perl без требований к компиляции -
как проверить что модуль не годится?
Новости географии: в одном люксембургском углу находится никому не известная деревня Шенген, ближайшая к ней железнодорожная платформа, буквально на другом берегу реки — Perl (по-русски всё-таки Перль), это же имя носит и муниципалитет (в других переводах — коммуна), и крупнейший его населённый пункт. А рядом с ними — Apach, но по-русски это не Апач, а, если верить википедии, Апаш, хотя, думаю, немцы могут прочесть и как Апах. При этом все три эти деревни — в разных странах.
Вышел отчёт по собранным Мойкругом зарплатам на середину 2018 года — https://vc.ru/flood/43849-zarplaty-it-specialistov-na-seredinu-2018-goda
В отчёте есть график, показывающий зависимость программистских доходов от используемых языков:
Перла тут нет вообще, а из того, на чём доводилось писать, самый выгодный — Руби. Видимо, придётся вспоминать, что там, и прокачиваться с юниора хотя бы до мидл-разработчика.
что вы думаете об этом?
к примеру пишем на го/php/java или другом простом понятном языке — все просто и понятно где надо взяли скопировали и поменяли код.
а если пишем на перл — разработчиков мало, язык сложный и архаичный. на тех поддержке и кастомизации зарабатывать можно неплохо наверное?
что есть готового чтоб сделать потоковый запрос
чтоб слать большой блок данных без загрузки в память полностью
т е вместо строки передавать обработчик который будет отдавать данные по частям или файловый handler
желательно не тащить либ с кучей звисимостей или бинарных модулей не стандартных
Чего хочется.
Хочется тегов (или хеша) к аттрибутам.
например
package Foo;
use Mouse;
has a => is => 'ro', isa => 'Str', tags => [ 'json' ];
__PACKAGE__->meta->make_immutable;
Ну и далее в методах сериализации (например) можно было бы попросить у meta список атрибутов и отбросить те которые не имеют заданного тега.
В данном примере на стадии has мы бы указали что сериализатору json можно сериализовывать этот атрибут.
я тут покопал как делаются расширения MouseX, но чет не вкуриваю откуда начинать вообще раскапывать сие.
есть у кого под рукой рабочий пример как добавить свою опцию в атрибут?
всех с пятницей!
Программировать, используя какую-нибудь могучую интегрированную среду разработки (IDE) — хорошо и зачастую удобно: там «из коробки» могут предоставляться различные удобные штуковины — компиляция, отладка, тестирование, работа с системами контроля версий. Однако некоторые системы при всём своём могуществе оказываются не совсем подходящими — например, могут много весить и сильно тормозить. Приходится выбирать что-нибудь полегче, например, Geany.
В Geany есть (в том числе и средствами дополнительных модулей) всякое:
.t
и лежащие в каталоге t/
. Для того, чтоб, видя в редакторе открытый файл с тестами, прогнать тесты, в настройках придётся добавить путь к корневой папаке приложения. Чтоб не писать путь целиком, можно воспользоваться шаблонами. В документации пишут:The first occurrence of each of the following character sequences in each of the command and working directory fields is substituted by the items specified below before the command is run.
- %d - substituted by the absolute path to the directory of the current file.
- %e - substituted by the name of the current file without the extension or path.
- %f - substituted by the name of the current file without the path.
- %p - if a project is open, substituted by the base path from the project.
- %l - substituted by the line number at the current cursor position.
Ситуация: жил-был Сфинкс (поисковая система Sphinx) на старом сервере, да пришла пора на новый переезжать. Нужный порт на новом месте доступен скриптам, что живут там же, а снаружи — нет и не надейтесь. Результат — кое-где тесты покраснели.
На сервере есть SSH — значит, можно проложить туннель, чтоб разработчик мог тестировать свои приложения на своих компьютерах, прежде чем делать коммиты и лезть на сервер. Команда для проброса стандартного сфинксового порта 9312 с локальной машины на сервер может выглядеть так:
ssh -L 9312:localhost:9312 server.name
man ssh
) пишут:SYNOPSIS ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname [command] ... -f Requests ssh to go to background just before command execution.
ssh -fL 9312:localhost:9312 server.name sleep 5
test `uname -n` != 'server' && ssh -fL 9312:localhost:9312 server.name sleep 5
./application.pl test
, и командой prove
, и как-нибудь ещё — я, например, обычно создаю Makefile
с нужными мне задачами и тесты выполняю командой make test
— мне так удобнее. Чтоб не рассматривать все возможные варианты тестирования, надо поместить открытие туннеля прямо в тест. Если конфигурация приложения хранится в каком-либо отдельном файле (YAML хорошо для этого подходит — в Моджолишисе есть плагин для чтения ЯМЛ-конфигов), можно команду открытия туннеля хранить рядом с остальными настройками — это лучше, чем пихать её в тест. А в тесте останется лишь вызвать её после создания объекта Test::Mojo:
my $t = Test::Mojo->new();
system($t->app->config->'sphinx'->'tunnel') == 0
or warn "Cannot open SSH tunnel to Sphinx: $!";
Если в целях переносимости хранить перловые модули рядом со своим кодом — будет не очень хорошо. Если при этом ещё и своих собственных модулей наберётся не один десяток (я такой винегрет встречал) — совсем плохо. Вывод — надо разделять.
Один из вариантов — использовать carton. Для тех, кому лень читать по-английски, есть перевод — статья Вячеслава Тихановского «Локальная установка и использование Perl-модулей» из журнала Pragmatic Perl за 2014 год.
Carton берёт список модулей, ставит их локально (root не нужен) вместе с зависимостями и позволяет запускать приложения с таким вот набором модулей. Список используемых модулей (если carton ещё ничего не ставил) можно достать из скриптов и своих модулей:
find . -type f -name \*p\[lm\] -exec egrep -n '^use ' '' ';' \
| cut -d' ' -f 2 | sort -u
Module::Name
, достаточно добавить в файл cpanfile
строку
requires 'Module::Name';
requires 'Sphinx::Search', '0.28';
requires 'Sphinx::Search', '== 0.28';
carton install
, версия поменяетсяInstalling modules using /home/.../cpanfile Successfully installed Sphinx-Search-0.28 (downgraded from 0.31) 1 distribution installed
carton exec
может пригодиться для запуска не только самого́ приложения, но и чего-нибудь ещё:
carton exec prove -l
Хочу упростить загрузку файлов пользователем на некоторые сайты, сделанные на Mojolicious::Lite — нужна обработка нескольких файлов за раз плюс поддержка drag and drop — это удобно, когда надо загрузить несколько файлов, которые в проводникефайловом менеджере либо просмотрщике картинок отображаются не рядом.
Естественно, ищу готовые примеры, чтоб не изобретать велосипед. Нашёл два:
знаю есть perl2exe и pp но это по сути к интерпретатору прикрепляет сорцы
а есть полноценные?
чтоб както преобразовал в с/c++ и потом через gcc скомпилил (через mingw для винды)
ближайшие аналоги - у python есть Nuitka, Nim, haxe
Для разминки и в честь приближения весны поковырял один зелёный сайт.
Попутно выяснил странную штуку: почему-то перловое приложение на Mojolicious::Lite всегда запускает тесты в режиме отладки вместо боевого несмотря на явное указание
./app.pl test -m deployment
Вышел новый релиз perl6 Rakudo Star 2018.01.
И простейший тест из цикла со сложением целых: $s+=$x++ while $x < $y; стал работать быстрее чем в perl5.
Поздравляю товарищи!
Программам нужна документация и чем программа больше — тем сильнее эта самая документация нужна. Для некоторых языков программирования существует возможность генерировать документацию на основе имеющихся комментариев при помощи специальных программ. В перле подобная возможность — создавать документацию из комментариев — тоже есть, но здесь не требуются какие-то сторонние программы — всё уже сразу есть. Речь идёт о POD — Plain Old Documentation format — языке разметки для документирования перла, перловых программ и перловых модулей — текст, размеченный с его помощью, можно сразу в скрипты вставлять. Подробнее написано в man perlpod.
Можно сделать и так, чтоб консольное перловое приложение выводило документацию о себе, если запущено с определёнными аргументами, например, -?
, -h
или --help
вызывало бы вывод краткой информации, а -m
, --man
или --manual
— полной. Делается это так:
#!/usr/bin/perl
=head1 SYNOPSIS
./script-name.pl I<[options]>
=head1 OPTIONS
... ещё документация
=cut
use Getopt::Long;
use Pod::Usage qw( pod2usage );
my $need_help;
my $need_manual;
GetOptions(
# обработка других аргументов
'help|?' => \$need_help,
'manual' => \$need_manual,
);
pod2usage(1)
if $need_help;
pod2usage('verbose' => 2)
if $need_manual;
-?
— видим краткую справку, пробуем -m
— видим что попало: где-то видна документация, а где-то — исходный код. Если после выхода из просмотра этого кода внимательнее посмотреть на экран, можно заметить сообщениеYou need to install the perl-doc package to use this program.
$ perldoc ./script-name.pl
You need to install the perl-doc package to use this program.
$ sudo apt install perl-doc
...
$ ./script-name.pl --man
SYNOPSIS
./script-name.pl [options]
...