:camel: perl6 test
- https://en.wikibooks.org/wiki/Category:Perl_6_Programming
- http://habrahabr.ru/search/?target_type=posts&q=[perl6]&order_by=date
git clone https://github.com/tadzik/rakudobrew ~/.rakudobrew
echo 'export PATH=~/.rakudobrew/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
rakudobrew build moar
rakudobrew build-panda
panda install Task::Star
Примеры:
#!/usr/bin/perl
use v6;
my @squares = <1 2 3 4 5 6 7 8 9 10>;
print "\@squares: ";
for @squares {
print $_ ~ " ";
}
my @a = (1, 2, 3);
# или
my @a = ^4; # Range
# или
my @a = 1 ... 3; # Lazy list
# или
my @a = 1 .. 3; # Range
my @squares2 = 1..10;
say "\n\@squares2[9] = " ~ @squares2[9];
my @squares3 = 1..*;
say "\@squares3[999] = " ~ @squares3[999];
my @squares4 = (1..10).map(-> $x { $x * $x });
say "\@squares4 = " ~ @squares4.join(',');
my @squares5 = (1..*).map(-> $x { $x * $x });
say "\@squares5[9] = " ~ @squares5[9];
1..3 Z+ 4..6; # (5, 7, 9)
# Since `Z` is list-associative (see the list above),
# you can use it on more than one list
(True, False) Z|| (False, False) Z|| (False, False); # (True, False)
# And, as it turns out, you can also use the reduce meta-operator with it:
[Z||] (True, False), (False, False), (False, False); # (True, False)
my @urls = <
cpan.org
kosciol-spaghetti.pl
perlcabal.org
duckduckgo.com
perl6.org
>;
my $count = @urls.elems;
https://doc.perl6.org/language/5to6-perlfunc
Текущая директория:
my $folder = $?FILE.IO.absolute;
say "Folder $folder is exists: ", $folder.IO.d;
В php так:
$folder = __DIR__;
echo "Folder $folder is exists: ", is_dir($folder);
Обход ассоц. массива:
# Associative array
my %drinks =
France => 'Wine',
Bavaria => 'Beer',
USA => 'Coke',
Moldova => 'Кагор';
for %drinks.kv -> $key, $val
{
say "$key: $val";
}
# France: Wine
# Moldova: Кагор
# USA: Coke
# Bavaria: Beer
Perl 6 примеры - https://github.com/perl6/perl6-examples
1) Есть в perl 6 инетересная фича - элегантный вызов методов по цепочке с права налево при помощи оператора "двоеточие", в стиле православного языка программирования haskell, смотрим:
Вызов методов по старинке:
$foo.log( $obj.nukanate( $foo.grep(*.bar).map(*.ber) ) );
Новый способ вызова метода:
$foo.log: $obj.nukanate: $foo.grep(*.bar).map: *.ber;
2) Ещё интересный пример:
(Здесь нет перебора и сравнения значений в цикле!)
my @args = <-a -e -b>;
my $verbose-selected = any(@args) eq '-v' | '-V';
if $verbose-selected.not {
say "Verbose option not present in arguments";
}
В python 3 тот же код выглядел бы как-то так:
args = ('-a', '-e', '-b')
verb_selected = (v in ('-v', '-V') for v in args)
if True not in verb_selected:
print('Verbose option detected in arguments.')
3) В цикле for можно проверять тип элемента:
my @a = 1..Inf;
for @a[^5] -> Int $i { say $i; }
Ссылки по теме:http://perl6.party/post/Perl-6-Shortcuts--Part-1
Destructure your Arguments with Perl 6 Signatures (https://perl6advent.wordpress.com/2017/12/05/day-5-destructure-your-arguments-with-perl-6-signatures/)
Сумма значений элементов массива:
php:
echo array_sum([1,2,3,4,5,6,7,8,9]);
python:
print(sum([1,2,3,4,5,6,7,8,9]));
perl 6:
say [+] (1,2,3,4,5,6,7,8,9);
или
say sum (1,2,3,4,5,6,7,8,9);
Hyper Operatorshttps://docs.perl6.org/language/operators#Hyper_Operators
Примеры:
my @array = 1..^5;
@array>>.say; # 1  2  3  4 
say (1, 2, 3) »*» 2; # OUTPUT: «(2 4 6)»
say (1, 2, 3, 4) »~» <a b>; # OUTPUT: «(1a 2b 3a 4b)»
say (1, 2, 3) »+« (4, 5, 6); # OUTPUT: «(5 7 9)»
my @a = 1, 2, 3;
@a»++; # 2, 3, 4
Поиск в массиве:
# Ищем 2 в массиве справа, если есть - вернётся True
say 2 (elem) (1,2,3,4,5);
# То же самое, но массив слева, а 2 справа, если есть - вернётся True
say (1,2,3,4,5,6) (cont) 2;
Есть класс с методом
even (проверяет числа на чётность):
class BetterInt is Int {
method even { self %% 2 }
}
И можно создать объект класса по старинке:
my BetterInt $x = BetterInt.new(42);
say $x.even();
Или так:
my BetterInt $x .= new: 42;
say $x.even;
Или даже уот так уот:
my $x = 42 but role { method even { self %% 2 } };
say $x.even;
Звезда в шоке!
Идентификаторы (https://docs.perl6.org/language/5to6-nutshell#Identifiers)sub test-doesn't-hang { ... }
my $ความสงบ = 42;
my \Δ = 72; say 72 - Δ;
Как вам имя функции
test-doesn't-hang ? :trollface:
subset (https://docs.perl6.org/language/typesystem#index-entry-subset-subset)
my enum Day ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
subset Weekday of Day where 'Mon' .. 'Fri'; # considered static
subset Today of Day where *.today;
Parameter # Set of possible values
========= ========================
Int $n # Int
Int $n where Today # Int plus dynamic where
Int $n where 1 <= * <= 5 # Int plus dynamic where
Day $n # 0..6
Day $n where Today # 0..6 plus dynamic where
Day $n where 1 <= * <= 5 # 1..5
Int $n where Weekday # 1..5
Day $n where Weekday # 1..5
Weekday $n # 1..5
Tue # 2
Сравниваем кол-во строк кода:
php5<?php
class MyFile
{
public $path = '';
public function __construct($file)
{
if (!file_exists($file)) {
throw new InvalidArgumentException('File ' . $file . ' not exists');
}
$this->path = $file;
}
public function __toString()
{
return $this->path;
}
}
function file_size(MyFile $file)
{
return filesize($file);
}
$file = new MyFile('C:\Users\inter\Desktop\book.pdf');
echo "File: $file\nSize: " . file_size($file);
perl6#!/usr/bin/env perl6
use v6;
subset MyFile of Str where { .IO.f or die "File $_ not exists"; }
sub file-size(MyFile $file)
{
return $file.IO.s;
}
my $file = 'C:\Users\inter\Desktop\book.pdf';
say "File: $file\nSize: " ~ file-size($file);
Итог:
php - 29 строчек кода
perl6 - 14 строчек кода
Интересные примеры создания новых операторов от Samantha McVey (https://cry.nu/perl6/creating-your-own-operators-in-perl-6/) (новый разработчик perl 6)
Перевод: Я действительно считаю, что perl 6 - язык будущего!Создание собственных операторов в perl 6:Создаём оператор
?=sub infix:< ?= > ($left is rw, $right) { $left = $right if defined $right }
my $var;
my $new ?= $var; # Ни одна операция не происходит
$var = 24;
$new ?= $var; # $new получает значение 24
Создаём оператор
x (умножение значений)
sub infix:< x >($left, $right) { $left * $right }
say 13 x 3; #> 39 # Умножаем значения
Создаём оператор
¯\_(ツ)_/¯ (сравнение значений)
sub infix:<¯\_(ツ)_/¯>($left, $right) { $left <=> $right }
10 ¯\_(ツ)_/¯ 5; #> More
5 ¯\_(ツ)_/¯ 5; #> Same
Создаём оператор
⟅ ⟆ (будем переворачивать каждое значение в массиве)
Обратите внимание - здесь оператор находится не в середине между значениями (infix), а по краям а-ля обычные скобки (circumfix)!
sub circumfix:<⟅ ⟆> ( *@array ) {
for @array.keys -> $i {
@array[$i] = @array[$i].flip;
}
@array;
}
say ⟅'cat', 'dog', 'bird'⟆; #> [tac god drib]
Массивы (всяко-разно)
Часть примеров взята из статьи Метаоператоры X и Z в Perl 6 (https://habrahabr.ru/post/253077/)
Быстро приводим числовой массив к строковому:
my @str = 0..9 X~ '';
# Array @str = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
Или то же вот так:
my @str = '0'..'9';
# Array @str = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
Но! Не делайте вот так:
my @str = '0'..'10';
# Array @str = ["0", "1"]
Сделать ассоциативный массив из списков ключей и значений
my %hash = @keys Z=> @values;
PHP to Perl6
htmlspecialchars on Perl6
https://github.com/moznion/p6-HTML-Escape
упс я не могу сюда показать код функции, так как некоторые символы меняются движком форума
Perl 6 vs Python 3
Задача: через каждые 4 символа строки вставить символ тире
Perl 6say 'abcdefghijk'.comb(4).join('-');
Python 3s, a, step = ('abcdefghijk', [], 4)
for i in range(0, len(s), step): a.append(s[i:i+step])
print('-'.join(a))
Задачка. 🧐
Отсюда (https://stackoverflow.com/questions/47999523/concatenating-lists-in-perl-6)
Дано:
my @prefixes = 'A'..'E';
my @suffixes = 'a'..'e';
my @roots = 1, 2;
Нужно получить из этих 3-x массивов вот такой массив:
[A1a B1b C1c D1d E1e A2a B2b C2c D2d E2e]
say @roots.map: |(@prefixes >>~>> * <<~<< @postfixes);
# (A1a B1b C1c D1d E1e A2a B2b C2c D2d E2e)
@roots.map: {|((@prefixes X~ $_) Z~ @suffixes)}
# (A1a B1b C1c D1d E1e A2a B2b C2c D2d E2e)
или
say @roots.map({ (@prefixes X~ $_) Z~ @suffixes }).flat;
# (A1a B1b C1c D1d E1e A2a B2b C2c D2d E2e)
String to lower case, first letter to upper.
pythonw = 'ТОП 7 ВСРАТЫХ БЕЗДАРЯМИ КИНОВСЕЛЕННЫХ'
print(w[0].upper() + w[1:].lower())
# Топ 7 всратых бездарями киновселенных
rakuDoc page - https://docs.raku.org/routine/tclc#class_Str
say 'ТОП 7 ВСРАТЫХ БЕЗДАРЯМИ КИНОВСЕЛЕННЫХ'.tclc;
# Топ 7 всратых бездарями киновселенных