Добрый вечер. Сегодняшний разговор будет о том, какими приемами можно пользоваться, чтобы смотреть значения переменных по ходу выполнения программы.
Интерактивную отладку мы рассматривать не будем, а коснемся только возможностей Perl 6 для удобного вывода переменных на печать.
say
Самое простое — функция say или одноименный метод, которые печатают простые объекты в довольно удобном виде:
my $str = 'Hello, World'; my $int = 42; my $rat = ¾; my @array = <alpha beta>; my %hash = GB => 'London', FR => 'Paris'; say $str; # Hello, World say $int; # 42 say $rat; # 0.75 say @array; # [alpha beta] say %hash; # {FR => Paris, GB => London} $str.say; # Hello, World $int.say; # 42 $rat.say; # 0.75 @array.say; # [alpha beta] %hash.say; # {FR => Paris, GB => London}
Этот же метод вполне пригоден и для классов:
class C { has $.x; } my $c = C.new(x => 10); say $c; # C.new(x => 10) $c.say; # C.new(x => 10)
perl
Чуть более изысканно — вызывать метод perl, возвращающий строку, которая теоретически является валидным кодом на Perl 6. Посмотрим, как это работает на примере тех же объектов:
say $str.perl; # "Hello, World" say $int.perl; # 42 say $rat.perl; # 0.75 say @array.perl; # ["alpha", "beta"] say %hash.perl; # {:FR("Paris"), :GB("London")} say $c.perl; # C.new(x => 10)
dd
В Rakudo Perl 6 (но не в самом языке Perl 6) есть функция dd, которая может использоваться в двух качествах. Во-первых, как дампер объектов:
dd $str; # Str $str = "Hello, World" dd $int; # Int $int = 42 dd $rat; # Rat $rat = 0.75 dd @array; # Array @array = ["alpha", "beta"] dd %hash; # Hash %hash = {:FR("Paris"), :GB("London")} dd $c; # C $c = C.new(x => 10)
Обратите внимание, что все переменные были созданы без ограничения на тип данных, но dd печатает и тип фактически находящихся в переменных данных.
Если же вызвать dd без аргументов, то она скажет, где находится. Например:
sub add($x, $y) { dd; # sub add($x, $y) return $x + $y; } dd; # block <init>() say add(1, 2); # 3
WHAT
Метод WHAT — один из самых простых способов интроспекции объектов, он возвращает название типа данных (или класса), хранящихся в переменной:
say $str.WHAT; # (Str) say $int.WHAT; # (Int) say $rat.WHAT; # (Rat) say @array.WHAT; # (Array) say %hash.WHAT; # (Hash) say $c.WHAT; # (C)
Пока на сегодня все. До завтра!
strip_tags! Будьте осторожны с угловыми скобками!
Спасибо. PHP вордпресса вредит перлу 🙂
Здравствуйте!
А есть все-таки возможность интерактивной отладки в Perl6 и есть ли аналог Deparse из Perl 5?
В теории есть какие-то модули и прагмы: https://docs.perl6.org/programs/01-debugging
Депарсинг вряд ли сильно поможет, все что есть это дамп внутренних этапов компиляции: perl6 —target=ast или —target=parse, например.
Понял. спасибо!