Почему в Perl так много "магии"?

Просмотр perlsub и perlop manpages Я заметил, что есть много ссылок на "волшебство" и "волшебство" (просто найдите любой из них для "волшебства" ). Интересно, почему Perl настолько богат в них.

Некоторые примеры:

print ++($foo = 'zz')            # prints 'aaa'       
printf "%d: %s", $! = 1, $!      # prints '1: Operation not permitted'
while (my $line = <FH>) { ... }  # $line is tested for definedness, not truth
use warnings; print "0 but true" + 1  # "0 but true" is a valid number!

Ответ 1

Когда функция Perl описывается как "волшебная":

Это означает, что эта функция реализованный звездой NBA Magic Johnson. Всякий раз, когда Perl выполняет "магию", это на самом деле отправка вызова RPC удаленный приемник, имплантированный в Magic сам. Он вычисляет ответ, и затем отправляет сообщение возврата. Использование г-на Джонсона для всех жестких частей Perl обеспечивает отличную абстракцию и упрощает перенос на новый платформ. Это проще, чем, скажем, Apache Portable Runtime.

Источник: perrin на Perl Monks

Это официально! Perl более волшебный.

Выполняется поиск из следующих поисковых запросов Google:

 25  site:ruby-doc.org     magic
 36  site:docs.python.org  magic
497  site:perldoc.perl.org magic

Ответ 2

Магия, на языке Perl - это просто слово, данное атрибутам, применяемым к переменным/функциям, которые позволяют расширить их функциональность. Некоторые из этих функций доступны непосредственно из Perl, а некоторые требуют использования C api.

Прекрасным примером магии является интерфейс tie, который позволяет вам определить собственную реализацию переменной. Каждая операция, которая может быть выполнена для переменной (выборка или сохранение значения для примера), подвергается переопределению, что позволяет использовать элегантные и логические синтаксические конструкции, такие как хэш со значениями, хранящимися на диске, которые прозрачно загружаются и сохраняются за кулисами.

Магия также может ссылаться на специальные способы, которыми могут управляться некоторые встроенные функции, например, как первый аргумент map или grep может быть либо блочным, либо голым выражением:

my @squares = map {$_**2} 1 .. 10;
my @roots   = map sqrt, 1 .. 10;

который не является поведением, доступным для пользовательских подпрограмм.

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

Вкратце, магия - это всякий раз, когда конструкция Perl ведет себя иначе, чем предполагала наивная интерпретация, исключение из правила. Магия, конечно, очень сильная, и ее нельзя использовать без особой осторожности. Магический Джонсон, конечно же, участвует в исполнении всей магии (см. FM-ответ), но это выходит за рамки этого объяснения.

Ответ 3

Интересно, почему Perl так богат ими.

Сделать все проще.

Вы обнаружите, что большинство "магии" в Perl - это упрощение синтаксиса для общих задач.

Ответ 4

Потому что perl всегда D oes W hat I M ean для некоторых значений всегда.

Ответ 5

Я думаю (мнение больше, чем факт), что это связано с точкой зрения органического роста, которую создатель Perl Ларри Уолл имеет с языком Perl. Python - это исследование противоположного подхода, стиль которого часто заставляет храбрых Perl сжиматься при восприятии того, что они вынуждены соответствовать стилистическому режиму.

Некоторые из них связаны с тем, что Perl разрабатывается так, чтобы быть "эффективным" при написании быстрых скриптов для выполнения задач Perl * -ish *, как в часы настенных часов, так и в нажатие клавиш. Некоторые из них связаны с TMTOWTDI мантрой Perl и ее последователями.

Программисты, как правило, упрямо относятся к Perl, частому использованию "магии", для некоторых это глазная напряженная визуальная какофония хаоса и неуважение к упорядоченности (которая восходит к дням компьютера Священство в белых лабораторных халатах за стеклянным окном), для других это яркий пример того, чтобы делать вещи эффективно, если не всегда очевидно, новичкам или аутсайдерам.

Ответ 6

Философия дизайна Perl заключается в том, что простые вещи должны быть простыми. Это звучит хорошо, и в некоторой степени это так. Тем не менее, существует компромисс: создание каждой простой вещи, при которой однострочный файл выводит тонны специальных хакеров для сохранения нескольких строк кода. У разных людей разные предпочтения в отношении простых операций в рамках простого языка в сравнении с простой формулировкой спецификации языка. Perl находится в одном пределе. Java находится на другом, по крайней мере, среди языков, которые люди фактически используют. Python и С# находятся где-то посередине.