Перейти к основному содержанию
Тема: [Perl 6] Examples / Примеры (Прочитано 4163 раз) предыдущая тема - следующая тема - Тема создана 12345

[Perl 6] Examples / Примеры

:camel: perl6 test

perl6 install (for linux)



Примеры:

#!/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
Цитата
Perl6 these were changed to:

    __LINE__            $?LINE
    __FILE__            $?FILE
    __PACKAGE__        $?PACKAGE
    __END__            =begin END
    __DATA__            =begin DATA



Текущая директория:
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

Re: [Perl 6] Examples / Примеры

Ответ #1
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

Re: [Perl 6] Examples / Примеры

Ответ #2
Сумма значений элементов массива:
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);

Re: [Perl 6] Examples / Примеры

Ответ #3
Hyper Operators

https://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





Re: [Perl 6] Examples / Примеры

Ответ #4
Поиск в массиве:
# Ищем 2 в массиве справа, если есть - вернётся True
say 2 (elem) (1,2,3,4,5);

# То же самое, но массив слева, а 2 справа, если есть - вернётся True
say (1,2,3,4,5,6) (cont) 2;

Re: [Perl 6] Examples / Примеры

Ответ #5
Есть класс с методом 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;

Звезда в шоке!

Re: [Perl 6] Examples / Примеры

Ответ #6
Идентификаторы
sub test-doesn't-hang { ... }
my $ความสงบ = 42;
my \Δ = 72; say 72 - Δ;
Как вам имя функции test-doesn't-hang ? :trollface:

Re: [Perl 6] Examples / Примеры

Ответ #7
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

Re: [Perl 6] Examples / Примеры

Ответ #8
Сравниваем кол-во строк кода:
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 строчек кода

Re: [Perl 6] Examples / Примеры

Ответ #9
Интересные примеры создания новых операторов от Samantha McVey (новый разработчик perl 6)

Цитата: Samantha McVey
I truly believe #perl6 is the language of the future.

twiter
Перевод: Я действительно считаю, что 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]

Re: [Perl 6] Examples / Примеры

Ответ #10
Массивы (всяко-разно)

Часть примеров взята из статьи  Метаоператоры X и Z в Perl 6

Быстро приводим числовой массив к строковому:
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;

Re: [Perl 6] Examples / Примеры

Ответ #11
PHP to Perl6

htmlspecialchars on Perl6

https://github.com/moznion/p6-HTML-Escape

упс я не могу сюда показать код функции, так как некоторые символы меняются движком форума

Re: [Perl 6] Examples / Примеры

Ответ #12
Perl 6 vs Python 3

Задача: через каждые 4 символа строки вставить символ тире

Perl 6
say 'abcdefghijk'.comb(4).join('-');

Python 3
s, a, step = ('abcdefghijk', [], 4)
for i in range(0, len(s), step): a.append(s[i:i+step])
print('-'.join(a))

Re: [Perl 6] Examples / Примеры

Ответ #13
Задачка. 🧐

Отсюда

Дано:
my @prefixes = 'A'..'E';
my @suffixes = 'a'..'e';
my @roots = 1, 2;

Нужно получить из этих 3-x массивов вот такой массив:
[A1a B1b C1c D1d E1e A2a B2b C2c D2d E2e]

одно из самых красивых решений

другие решения

 

Re: [Perl 6] Examples / Примеры

Ответ #14
String to lower case, first letter to upper.

python
w = 'ТОП 7 ВСРАТЫХ БЕЗДАРЯМИ КИНОВСЕЛЕННЫХ'
print(w[0].upper() + w[1:].lower())
# Топ 7 всратых бездарями киновселенных

raku
Doc page - https://docs.raku.org/routine/tclc#class_Str
say 'ТОП 7 ВСРАТЫХ БЕЗДАРЯМИ КИНОВСЕЛЕННЫХ'.tclc;
# Топ 7 всратых бездарями киновселенных