Просмотр perlsub и perlop страниц справочника, я заметил, что существует много ссылок на "волшебный" и "волшебное" там (просто ищут любого из них для "волшебства"). Интересно, почему Perl так богат ими.
Некоторые примеры:
print ++($foo = 'zz') # prints 'aaa'
printf "%d: %s", $! = 1, $! # prints '1: Operation not permitted'
while (my $line = ) { ... } # $line is tested for definedness, not truth
use warnings; print "0 but true" + 1 # "0 but true" is a valid number!
Когда функция Perl описывается как «волшебная»:
Это означает, что эта функция реализована звездой НБА Мэджиком Джонсоном. Каждый раз, когда Perl выполняет «магию», он фактически отправляет вызов RPC на удаленный приемник, имплантированный в Magic . Он вычисляет ответ, а затем отправляет ответное сообщение. Использование г-на Джонсона для всех сложных частей Perl обеспечивает отличный уровень абстракции и упрощает перенос на новые платформы. Это намного проще, чем, скажем, портативная среда выполнения Apache.
Источник: перрин на Perl Monks
Официально! Perl более волшебный.
Результаты следующих поисков Google:
25 site:ruby-doc.org magic
36 site:docs.python.org magic
497 site:perldoc.perl.org magic
Интересно, почему Perl так богат ими.
Чтобы упростить задачу.
Вы обнаружите, что самая "магия" Perl - это упрощение синтаксиса для общих задач.
Магия на языке Perl - это просто слово, присваиваемое атрибутам, применяемым к переменным / функциям, которые позволяют расширить их функциональность. Некоторые из этих функций доступны непосредственно из Perl, а некоторые требуют использования C api.
Прекрасным примером магии является интерфейс tie
, который позволяет вам определять собственную реализацию переменной. Каждая операция, которая может быть выполнена с переменной (например, получение или сохранение значения), предоставляется для повторной реализации, что позволяет создавать элегантные и логичные синтаксические конструкции, такие как хэш со значениями, хранящимися на диске, которые прозрачно загружаются и сохраняются за кулисами.
Magic также может относиться к особым способам поведения определенных встроенных функций, например, как первый аргумент map
или grep
может быть либо блоком, либо простым выражением:
my @squares = map {$_**2} 1 .. 10;
my @roots = map sqrt, 1 .. 10;
, что не является поведением, доступным для пользовательских подпрограмм.
Многие другие возможности Perl, такие как перегрузка операторов или переменные, которые могут возвращать разные значения при использовании с числовыми или строковыми операторами, реализованы с помощью магии. Контекст тоже можно рассматривать как магию.
Короче говоря, магия - это любое время, когда конструкция Perl ведет себя не так, как предполагала бы наивная интерпретация, исключение из правил. Магия, конечно, очень мощная, и ею нельзя пользоваться без особой осторожности. Мэджик Джонсон, конечно, участвует в выполнении всей магии (см. Ответ FM), но это выходит за рамки данного объяснения.
Потому что perl
always D oes W hat I M ean для некоторых значений always.
Я думаю (скорее мнение, чем факт), что это связано с точкой зрения органического роста, которую создатель Perl Ларри Уолл придерживается в отношении языка Perl. Python является примером противоположного подхода, чей стиль часто заставляет хакеров Perl содрогаться от ощущения, что их принуждают соответствовать стилистическому режиму.
Отчасти это связано с тем, что Perl был разработан для "эффективного" написания быстрых скриптов для выполнения задач, похожих на Perl*, как по времени, так и по количеству нажатий клавиш. Отчасти это связано с TMTOWTDI мантрой Perl и его последователей.
Программисты склонны расходиться во мнениях относительно частого использования "магии" в Perl, для одних это утомляющая глаз визуальная какофония хаоса и неуважения к упорядоченности (что напоминает о временах компьютерного священства в белых лабораторных халатах за стеклянным окном), для других это яркий пример эффективного выполнения задач, пусть и не всегда очевидного для новичка или стороннего наблюдателя.
Философия проектировать Perl заключается в том, что простые вещи должны быть простыми. Это звучит хорошо, и в какой-то степени это так. Тем не менее, существует компромисс: Делая каждую простую вещь один лайнер приводит к тоннам специальных случаев взломов, чтобы сохранить несколько строк кода. Разные люди имеют разные предпочтения относительно того, чтобы сделать простые операции внутри языка простыми, а не сделать спецификацию языка простой. Перл в одной крайности. Java на другой, по крайней мере среди языков, которые люди на самом деле используют. Python и C # находятся где-то между ними.