Sunday, November 8, 2009

Про интерполяцию в перле

Для "интерполируемых" конструкций (например, qq{}, qx{}, m{}, etc.) переменные, которые начинаются с "$" или "@" интерполируются. Так написано в man perlop. Но, есть и интересные детали..

Интерполяция имеет место быть и в следующих случаях:
  • print "$a[$i+1]";
  • print "$r->[1]";
  • print "$a[$f->()+1]";
  • print "@a[2..$f->()]";
Суммируя: операторы в отличие от переменных не интерполируются. За исключением случаев, когда интерполяция переменной требует значение от оператора, либо оператор представляет собой разыменование ссылки и за ним следует '[' или '{'.

По моему, неплохое средство обфускации кода :-)

P.S. Ссылка.

6 comments:

  1. > По моему, неплохое средство обфускации кода
    А можно это обобщить до некоего критерия качества языка?

    ReplyDelete
  2. Критерии качества скорее можно применять к тем, кто пишет программы imho.
    Если применить критерий "Количество магии", то перл -- явный лидер :-D

    ReplyDelete
  3. Дело ж не в магии, а в том, что многое приходится помнить наизусть. Правила эскейпинга, правила интерполяции, порядок и условия исполнения секций BEGIN/END/UNITTEST/whatever, ...
    Похожая ситуация в С++ с name resolution и вообще со всем.

    ReplyDelete
  4. Не обязательно ведь помнить все. Большинству хватает и минимума.
    Тем более опять же There's more than one way to do it ...
    P.S.
    perl -e '$! = 10; printf "%d: %sn", $!, $!'
    Чем не магия ? :-)

    ReplyDelete
  5. При написании - да. А при чтении? Вот и приходится вводить в коллективе ограничения на используемые языковые фичи, дабы все понимали всех.
    Интересно, что "трюкачество" субъективно - некоторые и цепочку из grep-map-grep сочтут обфусцированием.

    ReplyDelete
  6. Кстати, я насчитал 9 раз слово 'magic' в man perlop..

    ReplyDelete