Max Kirillov (max630) wrote,
Max Kirillov
max630

Category:

Perl: wtf

Мне очень стыдно, но моим первичным языком для хаканья является перл. Да, тот самый, который похож на base64. Как-то так получается, что именно с его помощью у меня лучше всего у меня получается get things done. Он уже мало развивается, следовательно стабилен. Он неплохо вылизан за все эти прошедшие годы. Он быстро работает, в моём понимании - быстро грузится, не занимает много памяти. Мой rss аррегатор работал на виртуалке с 32мб памяти, и там был ещё веб-сервер, ssh, cron и что-то ещё. И в целом он не подводит меня, я чувствую что могу на него положиться, и быть уверен что программа будет вести себя именно так, как я оожидаю, а не случится какой-нибудь ерунды.

Но вчера буквально за 1 вечер я узнал 2 новых вещи про него:

$perl -e 'use Data::Dumper; $a = {}; print Dumper($a); map { $_; } @{$a->{arr}}; print Dumper($a);'; 
$VAR1 = {};
$VAR1 = {
          'arr' => []
        };

Говоря короче, если у тебя переменная имеет значение unref, то если её использовать как ссылку на массив для чтения - этот массив создастся (пустой) и в переменной будет ссылка на массив. Это настолько не вяжется с обычным поведением перла - как правило он валится с ошибкой, что я подозреваю какой-то баг. По крайней мере, в документации я ничего не нашёл об этом.

Второе я нашёл в доках, но тоже выглядит не очень хорошо:
$perl -e 'use Data::Dumper; $a = [1,2]; sub a() { $_ = 'aa'; } map { a(); } @$a; print Dumper($a);'                                         
$VAR1 = [
          'aa',
          'aa'
        ];

- "$_" в map - глобальная (не my), поэтому её изменение в a() протекает в вызывающую функцию и меняет итерируемый массив. Решение - поставить my $_ перед map

PS: вот это второе, кстати - типичный косяк этого вашего метапрограммирования на макросах.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments