Перейти к основному содержанию

Новости

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

  • inter 😎
  • [*][*][*][*][*]
  • Царь
[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.dirname;
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
  • Последнее редактирование: 04 Декабрь 2017, 20:35:38 by inter 😎

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #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
  • Последнее редактирование: 06 Декабрь 2017, 18:52:28 by inter 😎

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #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);
  • Последнее редактирование: 27 Октябрь 2016, 20:42:59 by inter

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #3
Цикл For

Обход массива
for 1, 2, 3, 4 { .say }
то же самое:
for 1, 2, 3, 4 -> $i { $i.say }
то же самое:
my @array = 1, 2, 3, 4;
for @array { .say }
то же самое:
my @array = 1..^5;
@array.map: *.say;
то же самое:
for 1..4 { .say }
то же самое:
@array>>.say;

Проверка типа элемента, и ещё здесь есть Loop Phasers (эм, я не знаю как это перевести на русский):
Если у вас будет элемент с типом, отличимым от Int, то будет ошибка. FIRST сработает в начале, NEXT при каждом шаге цикла, LAST в конце, тем, кто знает английский это легко запомнить.
my @a = 1..Inf;
for @a[^5] -> Int $i {
    FIRST { say 'Поехали!'; say '-' x 10; }
    say $i;
    NEXT { say '-' x 10 ; }
    LAST { say 'Полёт завершён!'; }
}

# Результат:

Поехали!
----------
1
----------
2
----------
3
----------
4
----------
5
----------
Полёт завершён!

Вывод сразу двух элементов на ряд:
for 1, 2, 3, 4 -> $i, $j { "$i, $j".say }
# 1 2
# 3 4
Объединение двух массивов:
for @array1 Z @array2 -> $one, $two { ... }
Обход с индексом шага. Вам нужна функция enumerate из Python? Делайте так:
for ^Inf Z @array -> $index, $item { ... }
Или добавляйте индекс вот так:
for ^@array.elems Z @array -> $index, $item { ... }
То же самое (элегантное решение):
for @array.kv -> $index, $item { ... }
Массивов может быть много:
for @one Z @two Z @three Z @four -> $one, $two, $three, $four { ... }

Ссылки по теме:
https://perl6advent.wordpress.com/2009/12/07/day-7-looping-for-fun-and-profit/

  • Последнее редактирование: 06 Декабрь 2017, 18:58:23 by inter 😎

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #4
Поиск в массиве:
# Ищем 2 в массиве справа, если есть - вернётся True
say 2 (elem) (1,2,3,4,5);

# То же самое, но массив слева, а 2 справа, если есть - вернётся True
say (1,2,3,4,5,6) (cont) 2;
  • Последнее редактирование: 05 Ноябрь 2016, 10:56:19 by inter

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #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;

Звезда в шоке!
  • Последнее редактирование: 06 Декабрь 2016, 10:39:42 by inter

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #6
И всё-таки rakudo сыроват и годится пока лишь чтоб поиграться. И дело даже не в скорости, а в том, что есть ошибки парсинга кода. А это чревато. Например вы будете сравнивать строку и вместо True вам вылезет False, которого там быть не должно, а если это будет проверка пароля админа сайта?

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #7
Идентификаторы
sub test-doesn't-hang { ... }
my $ความสงบ = 42;
my \Δ = 72; say 72 - Δ;
Как вам имя функции test-doesn't-hang ? :trollface:
  • Последнее редактирование: 06 Декабрь 2016, 09:22:46 by inter

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #8
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
  • Последнее редактирование: 06 Декабрь 2016, 10:37:49 by inter

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #9
Сравниваем кол-во строк кода:
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 строчек кода
  • Последнее редактирование: 06 Декабрь 2016, 10:45:29 by inter

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #10
Интересные примеры создания новых операторов от 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]
  • Последнее редактирование: 06 Январь 2017, 17:06:59 by inter

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #11
Массивы (всяко-разно)

Часть примеров взята из статьи  Метаоператоры 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;
  • Последнее редактирование: 12 Июль 2017, 16:15:04 by inter 😎

  • inter 😎
  • [*][*][*][*][*]
  • Царь
Re: Perl 6. Примеры
Ответ #12
PHP to Perl6

htmlspecialchars on Perl6

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

упс я не могу сюда показать код функции, так как некоторые символы меняются движком форума
  • Последнее редактирование: 12 Июль 2017, 19:11:18 by inter 😎