perlsecret - Cекретные операторы и константы Perl
Cекретный операторы Perl:
Оператор Кличка Функция
======================================================
0+ Венус Venus Приведение к цифре
@{[ ]} Детскаякаляска Babycart интерполяция списка
!! 2 удара Bang bang логическое преобразование
}{ Эскимосское приветствие КОНЕЦ блока для однострочного скрипта
~~ Дюймовыйчервь Inchworm скалярный
~- Дюймовыйчервь на палке декремент высокого приоритета
-~ Дюймовыйчервь на палке декремент высокого приоритета
-+- Космическая станция Приведение к цифре высокого приоритета
=( )= Гоатсе скалярный / списочный контекст
=< >=~ Пылающий X-Wing Истребитель ищем во входных данных и присваиваем захваченное
~~<> Кайт, девочка убийца Одиночная строка ввода
<<m=~m>> m ; Богатый двухлезвийный меч Многострочный комментарий
-=! -=!! Плоская условное уменьшение
+=! +=!! Прямоугольная условное увеличение
x=! x=!! Крестовая условный резет на ''
*=! *=!! Шестилучевая отвертка условный резет на 0
,=> Подмигивающая жирная запятая не стрингифицирующая жирная запятая
()x!! Предприятие Enterprise Сквош логического списка
0+!! Ключ к истине числовое преобразование логических значений
||() Эбботт и Костелло Камеди дуэт удалить ложный скаляр из списка
//() Наклонный Эбботта и Костелло удалить undef из спискаPerl секретные константы:
Константы Кличка (Nickname) Значение
======================================================
<=><=><=> Космический флот 0
<~> Амфисбена Двойной путь $ENV{HOME}Perl имеет давнюю традицию давать прозвища для некоторых из своих операторов (возможноя форма очеловечивания). Эти прозвища основаны на скорее на виде оператора, чем на его функции. Известные примеры бриллиантовый оператор (<>), по прозвищу Стена Женевы и оператор космического корабля (<=>), прозванный Рендаль Шварц. Вот некоторые менее известные операторы Perl с ником толстая запятая (=>) и болтовня (...).
"Cекретный операторы" Perl были обнаружены (или созданы) Perl обфускаторами и Perl гольфистами, обычно при поиске более короткого пути выполнения операции. Секретный операторы не являются на самом деле секретными, и они не являются на самом деле операторами. Perl анализатор специально не признает их, и не пытается скрывать их от вас. Но они, являются операторами в том смысле, Perl программистам достаточно посмотреть на их конструкцию, чтобы понять, что они делают, не задумываясь о более мелких элементах и в конечном итоге добавляют их в свою коллецию инструментов. Они являются секретами в том смысле, что они должны обнаружены их будущем пользоватем (программистом), потому что они явно не описаны в основной документации Perl.
Так как секретные операторы не являются операторами, они не имеют реальных имен, и поэтому они нуждаются в прозвища (никнеймах). Как видно из описания Perl операторов выше их имя обычно связано с их формой.
Термин "секретный оператор", вероятно, был придуман Абигейлом в сообщении на comp.lang.perl.misc в январе 2003 года.
Многие из этих "операторов", не подходят для производственного кода, потому что они являются неясными для непосвященных, хотя некоторые из них - это просто имена для общих идиом (словосочетаний, фр. idiome «язык, наречие» происх от др.-греч. ἰδίωμα «особенность, своеобразие). Реально секретные операторы используются гольфистами, обфускаторами и людьми, которые любят повеселиться с их любимым языком программирования.
Вы можете попробовать их дома, но они могут быть не безопасны для работы!
В следующем разделе представлены секретные операторы Perl с некоторым историческим контекстом, объяснением того, как они работают и примерами использования.
0+
+0Оператор Венера - это очень распространенный фразеологизм. Он выполняет превращение в цифру, нумификацию значения стоящего справа/слева в зависимости от используемых версий. (Это достигается путем использование идентификатора добавления +).
print 0+ '23a'; # 23
print 0+ '3.00'; # 3
print 0+ '1.2e3'; # 1200
print 0+ '42 EUR'; # 42
print 0+ 'two cents'; # 0
$ref = [];
print 0+ $ref, ' ', "$ref"; # 164094424 ARRAY(0x9c7e1d8)
print 0+ $!, ' ', $!; # 2 No such file or directoryОбратите внимание, что 0+ — это имя метода, для "числового преобразования" в модуле overload.
@{[ ]}Открыта Лари Воллом, 1994. (Альтернативные клички: "шоппинг троллей", "коляска", "черепаха")
Оператор Детская коляска выполняет интерполяцию списка внутри строки. Элементы списка разделяются значением $".
# SQL в heredoc (документ-здесь)
local $" = ',';
my $sth = $self->execute( << "SQL" );
SELECT id, name, salary
FROM employee
WHERE id IN (@{[ keys %employee ]})
SQL
# аргументы находятся в хэше %arg
# и выводятся неизвестные аргументы
die "Uuh?: @{[ sort keys %arg ]}\n"Еще один вариант использования – для взлома алиасов (т.е. создании копии); Например, чтобы избежать фатальной ошибки при попытке модификации значения только для чтения при выполнении следующего кода:
for (qw( 1 2 3 )) {
$_ = $_ * $_; # надуманный
print "площадь: $_\n";
}С детской коляской (babycart) изменяемые данные фактически копируются в скаляр.
for ( @{[ qw( 1 2 3 ) ]} ) {
$_ = $_ * $_; # надуманный
print "площадь: $_\n";
}Это контейнер, или окаймляющий (циркумфикс) operator. Выражение внутри [] выполняется в списочном контексте и сохраняется в анонимном массиве, который сразу разыменовывается с помощью @{}.
Вы это иногда увидите это в рабочем коде.
!!Этот оператор был в общем использовании программистами C даже до существования Perl. Он выполняет логическое преобразование, выполняя логическое отрицание дважды.
my $true = !! 'a string'; # теперь 1
my $false = !! undef; # теперь ''}{(Альтернативный ник: "бабочка")
Открыт Абигалем в 1997.
Оператор приветствие Эскимосов является блоком END для однострочников.
Следующая программа подсчитывает и выводит число строк во входных данных:
$ perl -lne '}{print$.'Приветствие Эскимосов злоупотребляет использование опций -p и -n генерируя Perl код (показано, используя модуль B::Deparse):
$ perl -MO=Deparse -lne '}{print$.'
-e syntax OK
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
}
{
print $.;
}Открытие было сделано после того, как Perl Journal опубликовал интервью с Чипом Сальзенбергом(Chip Salzenberg), в котором он объяснил, что хак perl использует для реализации -p и -n.
Этнографическое примечание: в современной Западной культуре эскимосский поцелуй - это , когда люди целуются друг с другом соприкасая носы. Это основывается на традиционном инуитском приветствии, названном куник, ранние исследователи Арктики назвали его "эскимосский поцелуй" ("Eskimo kissing"), когда они впервые увидели его. Сам куник не является поцелелуем, он не эротичен, это просто форма нежного приветствия.
~~Этот оператор в основном короче scalar(убирает целых 4 символа!) используя ту же идею, как секретный оператор bang bang.
$ perl -Esay~~localtime
Tue Mar 13 19:53:25 2012Дюймочервь выглядит очень похоже на смарт матч оператор, представленный в Perl 5.10, но так как это на самом деле последовательность двух унарных операторов, анализатор Perl не сможет смешать его с двоичным смарт матчем.
Обратите внимание, что Perl ~ является чувствительным операндом: если его операнд имеет числовое значение (либо потому, что был присвоен номер, в результате числовая операция, или используется в числовом контексте), это побитовое числовое отрицание (сначала неявно преобразует целое число без знака (unsigned integer (UV)), или за областью use integer, знаковое целое число, (signed integer (IV))); в противном случае это строковое поразрядное(побитовое) отрицание.
И это объясняет, как эта операция отличается от !!. Вместо того, чтобы заставить операнд быть булевым (логическим), он применяет его или к строке или к цифре(в зависимости от операндов).
Таким образом, для большинства входных данных, Дюймочервь (inchworm) действует так же, как scalar().
Примеры исключений:
# с плавающей точкой
$x = 1.23;
print ~~$x; # 1
# строка используется в числовом контексте
$x = "1.23";
print ~~$x if $x != 0; # 1
# целое число вне диапазона (out of range)
use Config '%Config';
$x = 2**( 8 * $Config{uvsize} );
print ~~$x; # UV_MAX
$x = -1;
print ~~$x; # UV_MAX
$x = 2**( 8 * $Config{uvsize} - 1 );
{
use integer;
print ~~$x; # IV_MIN
}
$x = -2**( 8 * $Config{uvsize} - 1 ) - 1;
{
use integer;
print ~~$x; # IV_MIN
}Но это также удобно, как собирательное для получения строки из объектов, перегрузите его некоторым полезным образом:
use DateTime;
use JSON;
my $now = DateTime->now;
print encode_json { time => ~~$now };~-
-~Открыт Томом Хоспелом, 2002.
Эти два оператора выполняют высокоприоритетный декремент (~-) и высокоприоритетный инкремент(-~) для целых чисел (на архитектуре дополнительного кода ( two-complement) https://ru.wikipedia.org/wiki/Дополнительный_код_(представление_числа)). Этот трюк программисты языка ассемблера использую на протяжении десятилетий.
В C, Python и Ruby они работают на всех целых числах. Из-за того, как оператор ~ реализован в Perl (мало известный факт, что побитовые операторы Perl приводят операнд к беззнаковому целому ( unsigned integers) без use integer и к знаковому целому (signed integers) с use integer), эта пара секретных операторов ограничивается целыми числами со знаком. Это на самом деле еще большее ограничение, по умолчанию: ~- только уменьшает целые числа больше 0 и -~ только увеличивающем целые числа меньше 0. Для того, чтобы Дюймочервь на палке (Inchworm on a stick) работал на всех целых числах, он должен быть использован в сфере use integer, таким образом знаковые целые(signed integers) используются повсеместно в битовых операциях.
Этот гольф методика позволяет избавиться от пары скобок:
$y = ~-$x * 4; # аналогично $y = ($x-1)*4;Вот доказательство:
$x - 1 == - ( -$x ) - 1В двудополнительной архитектуре, чтобы получить обратное числа, все, что вам нужно сделать это сделать инверсию (flip) всех битов и добавить 1. То есть,
-$i == ~$i + 1Используем это, чтобы заменить - ( -$x ) на показанное выше, мы получаем:
$x - 1 == ( ~-$x + 1 ) - 1И после устранения единиц из уравнения,
$x - 1 == ~-$xЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ. (QED - от лат. quod erat demonstrandum)
Для -~, доказательство аналогично:
$x + 1 == - ( -$x ) + 1
$x + 1 == - ( ~$x + 1 ) + 1
$x + 1 == -~$x - 1 + 1
$x + 1 == -~$xВ обеих версиях высокий приоритет исходит из того, что ~ и унарный - оба имеют более высокий приоритет, чем все другие арифметические операторы (за исключением **).
Мнемосхема: назад стоящий дюймочервь на палке(~-) уменьшает, а дюймочервь по ходу движения на палке (-~) приращяет.
-+-Открыт Алистером Макглинчи, 2005.
Этот оператор выполняет приведение к цифре с высоким приоритетом.
print -+- '23a'; # 23
print -+- '3.00'; # 3
print -+- '1.2e3'; # 1200
print -+- '42 EUR'; # 42
$ref = [];
print -+- $ref, ' ', "$ref"; # 151097816 ARRAY(0x90191d8)
print -+- $!, ' ', $!; # 2 Нет такого файла или каталогаВо-первых это выглядит точно как оператор Венеры. Однако, потому что оператор Венеры использует двоичный +, он имеет более низкий приоритет, чем операторы умножения, такие как как * или x.С другой стороны оператор космической станции является объединением трех унарных операторов, и поэтому имеет более высокий приоритет.
В следующем примере мы будем пытаться печатать приведнную к цифре строку '20GBP' (т.eе '20') повторенную 3 раза.
# неправильно: выведет нумификацию '20GBP20GBP20GBP'
print 0+ '20GBP' x 3; # 20
# неправильно: это эквивалентно ( print '20' ) x 3
print( 0+ '20GBP' ) x 3; # 20
# правильно: но слишком длинно, слишком полисповски
print( ( 0 + '20GBP' ) x 3 ); # 202020
# верно: использование оператора космическая станция (space station)
print -+- '20GBP' x 3; # 202020Тем не менее, т.к. унарный минус просто заменяеть начальный C <-> или C <+> строки их аналогом, космическая станция не переводит в цифры строки, начинающиеся с минуса или I <строки, которые не начинаются с числа>:
print -+- 'two cents'; # +two cents
print -+- '-2B' x 5; # -2B-2B-2B-2B-2BВ примере выше, -+- '-2B' производит строку '-2B', в то время как 0+ '-2B' дал бы ожидаемое число (-2).
=( )=(Еще одно имя: "Сатурн")
Если вы не понимаете имя этого оператора, считайте себя счастливчиком. Вам рекомендуется не искать его в Интернете для визуального объяснения.
Оператор гоатсе предоставляет списочный контекст его правую сторону и возвращает количество элементов на ее левой стороне. Обратите внимание, что левая сторона должна обеспечивать скалярный контекст; очевидно списочный контекст с левой стороны будут получать пустой список в середине.
Объяснение того, что присвоение списка в скалярном контексте возвращает количество элементов в правой части назначения, независимо от как много из этих элементов были на самом деле присваивоены переменным. В этом случае все элементы справа просто передают пустой список (и поэтому отбрасываются).
# считает число слов в $_
$n =()= /word1|word2|word3/g;
# $n = 1
$n =()= "abababab" =~ /a/;
# $n = 4
$n =()= "abababab" =~ /a/g;Оператор гоатсе представляет собой контейнер (sic!), поэтому он также может использоваться для присвоения значения с правой стороны переменным внутри него.
# $n = 4; $b = 'a'
$n =($b)= "abababab" =~ /a/g;
# $n = 4; @c = qw( a a a a )
$n =(@c)= "abababab" =~ /a/g;В некоторых случаях полный гоатсе не нужен, потому что нет необходимости для хранения значения в переменной. Побочный эффект списочного присвоения в скалярные контексте может быть получен правостороннем гоатсе (()=) используемый в скалярных контексте имеет другое значение, чем присвоение скаляру. Например:
# удаление пустых ссылок на массивы
@arrays = ( [], [1], [ 1, 2 ], [], [ 5 .. 9 ] );
# @filled = ( [1], [ 1, 2 ], [ 5 .. 9 ] );
@filled = grep +()= @$_, @arrays;(+ в строке выше не операция, используется, что сказать grep, что скобки не включают его аргументы.)
Вот запутанный пример, где =()= , представляется, как соответствующей конструкцией для использования, но это на самом деле еще один секретный оператор, в действительности это трюк.
Представьте, что вы хотите знать, на сколько элементов split() разобьет строку, но не заботится о самих элементах. Используйте split() в скалярных контексте:
my $count = split /:/, $string;Дает правильный ответ, но и предупреждение:
Use of implicit split to @_ is deprecated
Использование неявного сплита для @_ не рекомендуетсяИспользование =()= для приведения к скалярному контексту на левой стороне (чтобы получить число подстрок) и списочный контекст на правой стороне (чтобы избежать устаревшую конструкцию не в списочном контексте) кажется, вот правильное решение:
my $count =()= split /:/, $string;Она действительно не предупреждает, но всегда возвращает 1(что вообщето неправильно).
Причина того, что split() никогда не разбивается больше полей, чем необходимо. И компилятор интерпретирует, сохранение результатов в () , не заботясь о о результатах, так split() не будет разбивать строку на всё, и таким образом вернуть полную строку, которая дает список только одного элемента в скалярном контексте, следовательно 1.
У вас есть два варианта решения этой проблемы. Во-первых можно переопределить split() оптимизацию, явно задавая его разделить на неограниченное число полей:
my $count =()= split /:/, $string, -1;Или же вы можете победить оптимизации с помощью другого секретного оператора вместо этого детской коляской:
my $count = @{[ split /:/, $string ]};Это понуждает split() обнаружить, что вызывающий объект может хранить любое количество полей, таким образом он будет на самом деле делать работу до того, как анонимный массив выбрасывается после использования в скалярном контексте.
=<>=~Открыт Филиппом Брюа, 2007.
Этот оператор применяет регулярное выражение к одной строке ввода и назначает захваченных значения в выражение на его левой стороне.
# поймать имена полей из входящего потока (input)
@data{@fields} =<>=~ $regexp;Объясняетя вышеназванное выражение: =~ обеспечивает скалярный контекст для левой стороны <> таким образом, что ищет во входящей строке. Если регулярное выражение содержит захваты, имеющие структуру массива с левой стороны, = обеспечивает списочный контекст и захваченные данные назначаются структуре.
Этот оператор также является контейнером. Поэтому X-Wing может иметь пилота!
# используй исходный текст, Люк!
$luke = \*DATA;
@data{@fields} =<$luke>=~ $regexp;~~<>Открыт Филиппом Бруа, 2012. (Альтернативное название: "сперматазоид")
Этот оператор на самом деле сочетание Дюймочервя и бриллиантового оператора. Он обеспечивает скалярный контекст встроенному readline(), таким образом, возвращая одну строку ввода.
Это полезно только в списочном контексте (так как <> уже возвращает единую линию ввода в скалярном и пустом контекстах), например, для получения сразу несколько линий:
@triplets = ( ~~<>, ~~<>, ~~<> ); # три спермы в одно яйцо?Как и другие операторы, основанные на скобочных конструкциях , кайт контейнер и может нести полезную нагрузку (в данном случае, дескриптор файла).
Обратите внимание, что когда дескриптор файла дочитан до конца, оператор кайт будет возвращать пустую строку вместо C <undef>.
Мнемоника: Он обеспечивает функцию, которая привязана к одной строке, строке, как она была. (Tye Маккуин в http://www.perlmonks.org/?node_id=959906).
<<m=~m>>
m
;Создан Абигалем, 2003, for comp.lang.perl.misc.
Этот оператор обеспечивает многострочные комментарии, путем разумного использования heredoc-синтаксиса и красивой симметрии. Цитата <slrnb382jc.tfm.abigail@alexandra.abigail.nl>:
<<m=~m>>
Используйте тайный оператор в предыдущей строке.
Запишите ваши комментарии здесь.
Много и много комментов.
Вы даже можете использовать пустые строки.
Закончим с одной
m
;"Орнамент" m ленты с ; бросает меч, привязанный к нему.
Обратите внимание, что "комментируемый" текст на самом деле строка в двойных кавычках в пустом контексте, что может иметь некоторые побочные эффекты.
Открыт Дмитрием Карасиком, 2007, при поиске операторов, основанных на знаке !.
Все отверточные операторы являются условными операторами. Как отвертки, они приводятся к 4м основным типам, с различными длинами ручек.
Плоская
-=!! -=!
Этот оператор обеспечивает условное уменьшение:
$x -=!! $y # $x-- if $y; $x -=! $y # $x-- unless $y;
Прямоугольная
+=!! +=!
Этот оператор обеспечивает условное увеличение:
$x +=!! $y; # $x++ if $y; $x +=! $y; # $x++ unless $y;
Шестилучевая
*=!! *=!
Этот оператор обеспечивает условный сброс на
0:$x *=!! $y; # $x = 0 unless $y; $x *=! $y; # $x = 0 if $y;
Оператор шестилучевая отвертка не работает должным образом с отрицательными числами отличными от
-1на Perl версии ниже или равно, чем 5.13.5. Он также не удается с-1на Perl версии ниже или равной 5.7.0.Крестовая
x=!! x=!
Этот оператор обеспечивает условный сброс на
'':$x x=!! $y; # $x = '' unless $y; $x x=! $y; # $x = '' if $y;
(Это один был обнаружен Филиппом Брюа в 2009 году, при подготовке лекции о тайных (секретных) операторах.)
Мнемоника: головка отвертки является лучшим мнемоникой ческие (- and + для инкремента и декремента, * для несуществующего значения (null), x для пустой строки).
,=>Открыта Абигалем, 2010. (Альтернативное имя: "крюк" "grappling hook")
Визуально выглядит как жирная запятая, но без левой стороннего поведения.
Этот оператор используется для сохранения документированной особенности жирной запятой, при отключении строкового толкования слова слева.
use constant APPLE => 1;
use constant CHERRY => 2;
use constant BANANA => 3;
%hash = (
APPLE ,=> "green",
CHERRY ,=> "red",
BANANA ,=> "yellow",
);эквивалентно:
%hash = ( 1, "green", 2, "red", 3, "yellow" );Мнемоника: запятая C <,> является выключателем для жирной запятой в ее стрингификации (приведении к строке).
( )x!!Обнаружил Аристотель на PerlMonks, 2006. (Альтернативный ник: «NCC-1701», «улитка» "snail")
Часто необходимо условно включать элементы в список:
my @shopping_list = ('bread', 'milk');
push @shopping_list, 'apples' if $cupboard{apples} < 2;
push @shopping_list, 'bananas' if $cupboard{bananas} < 2;
push @shopping_list, 'cherries' if $cupboard{cherries} < 20;
push @shopping_list, 'tonic' if $cupboard{gin};Предприятия позволяет создавать список и добавлять только элементы, которые удовлетворяет условию, в одной инструкции:
my @shopping_list = (
'bread',
'milk',
('apples' )x!! ( $cupboard{apples} < 2 ),
('bananas' )x!! ( $cupboard{bananas} < 2 ),
('cherries' )x!! ( $cupboard{cherries} < 20 ),
('tonic' )x!! $cupboard{gin},
);Этот оператор представляет собой контейнер, а это значит, предприятие может иметь большой экипаж.
Предприятие это просто повторение списочного оператора ()x затем логическое значение (см "Bang bang" "Двойной удар" оператор выше), который будет интерпретируется как 1 или 0 в числовом контексте. Следует отметить, что выражение слева всегда выполняется, независимо от условия.
Из-за вопросов приоритета, сложных условиях в конце оператора ентерпрайз (предприятия) может потребоваться поставить в скобки.
0+!!Обнаружен Тоби Инкстер, 2013.
Этот оператор - комбинация операторов Венеры (Venus), и двойного удара(bang bang). Он просто превращает логическую ложь числовое значение 0.
my $true = 0+!! 'a string'; # теперь 1
my $false = 0+!! undef; # теперь 0||()Обнаружен Ивом Ортоном.
Этот оператор делает ложное значение исчезающим в списочном контексте. Он просто заменяет ложный скаляр пустым списком.
my @shopping_list = (
'bread',
'milk',
$this ||(),
$that ||(),
'apples'
);Мнемоника: один высокий, (а также "прямой человек") и один жирный, , как в известном комедийном дуэте.
//()Предложен Дэмиеном Кроткиным, 2014.
Этот оператор работает точно так же, как "Эбботт и Костелло" , за исключением того, что он только делает undef исчезающим в списочном контексте.
Этот оператор работает только в версиях Perl 5.10 выше.
Мнемоника: в этой версии, "прямой человек" склоняется (и, поэтому, реальная ассоциативность "(склюняющийся Эботт) и Костелло" ).
<=><=><=>Открыт Домианом Конвеем.
Даже несмотря на то, что он выглядит как последовательность из трех космических кораблей, только средний корабль является фактическим кораблем. Два внешних "корабля" являются на самом деле вызовом glob("=").
Эта константа имеет значение 0.
<~>Обнаружил Рафаэль Гарсия Суарес, 2009.
Под Unix будет равна в домашнему каталогу пользователя (с помощью C <glob>). На Win32 он будет расширять $ENV{HOME}, если он установлен (что является довольно редко) или возвратит '~'.
Филипп Брюа (книга)
Автор хотел бы поблагодарить José Castro, Andrew Savige, Dmitry Karasik, Abigail, Yitzchak Scott-Thoennes, Zefram, Tye McQueen, Maxim Vuets, Aristotle Pagaltzis, Toby Inkster, Ævar Arnfjörð Bjarmason, Rafaël Garcia-Suarez, Andreas J. König, Andy Armstrong, Pau Amma, Keith C. Ivey, Michael R. Wolf, Olivier Mengué, Yves Orton, Damien Krotkine, Diab Jerius, Ивана Бессарабова и ожидает (Fun) в списке рассылки Perl вдохновения, предложений и патчей.
Если вы знаете другие тайные операторы и константы, пожалуйста, дайте мне знать!
Однако, прежде чем отправить мне ваше последнее творение, следует знать, что, хотя они устанавливаются не в камне, я считаю следующие критерии до добавление оператора или константы в этот список:
имеет ли он ник? (обычно такое, которое соответствует его художественной ASCII форме),
используется ли он на самом деле в дикой природе?
имеет ли он гольф-специфичный интерес? (т.е. он выполняет некоторые полезные операция в значительно меньше числе символов, чем "нормального" Perl код?)
имеет ли он исторический интерес?
Как показано ниже, большинство действий секретных операторов происходит в веселом списке рассылки Perl.
Around 1993, according to Randal Schwartz in his "My half-life with Perl" talk given on July 25, 2013 at OSCON:
Larry's daughter (Geneva?) named the <> operator for me (I named the <=>)
Post
<1994May1.035104.25990@netlabs.com>incomp.lang.perlLarry Wall discovers the baby cart and describes it as "a way to interpolate function results into a string".
Post
<slrnb382jc.tfm.abigail@alexandra.abigail.nl>incomp.lang.perl.miscAbigail coins the term "secret operator" to describe
<<m=~m>> m ;.http://www.nntp.perl.org/group/perl.fwp/2005/02/msg3691.html
Original "secret operators" thread. Several of the detailed explanations in this manual page come from this thread.
http://www.nntp.perl.org/group/perl.fwp/2005/02/msg3708.html
Description of the space station operator.
http://www.nntp.perl.org/group/perl.fwp/2005/02/msg3712.html
Philippe Bruhat uses the word "venus" to describe
0+.http://www.nntp.perl.org/group/perl.fwp/2006/07/msg3855.html
Naming the baby cart operator.
http://www.nntp.perl.org/group/perl.fwp/2006/07/msg3891.html
Aristotle Pagaltzis explains how the baby cart can be used to break aliasing.
http://www.perlmonks.com/?node_id=564792
Secret Perl Operators: the boolean list squash operator, x!!, by Aristotle Pagaltzis, describes the Enterprise operator.
http://www.nntp.perl.org/group/perl.fwp/2007/11/msg4006.html
Description of the flaming X-Wing secret operator.
http://www.nntp.perl.org/group/perl.fwp/2007/11/msg4028.html
Description of the screwdriver operators, and other
!-based operators.http://www.nntp.perl.org/group/perl.golf/2009/06/msg2524.html
Description of the fourth screwdriver operator (Pozidriv).
http://www.nntp.perl.org/group/perl.fwp/2012/03/msg4169.html
Description of the sperm/kite operator.
http://www.nntp.perl.org/group/perl.fwp/2012/04/msg4192.html
Proposal for an alternate, family-friendly, nickname for the goatse operator, with a second order inside joke.
The Abbott and Costello operator was first presented to me on 2013-09-25 by Yves Orton in private messages.
I tried to propose "Laurel and Hardy" as a more internationally understable alternative, but it turns out Hardy is both the fat and the tall one.
The key to the truth operator was described to me on 2013-09-28 by Toby Inkster on the
#mooseIRC channel and private messages.On 2014-02-18, on the
#perlfrIRC channel, Damien Krotkine notes that he uses//()more than||(), to which Philippe Bruhat answers immediately with the name "Leaning Abbot and Costello", noting that Abbot is the tall one.
More secret operators didn't make it to this list, because they don't have a name yet.
http://www.nntp.perl.org/group/perl.fwp/2007/11/msg4028.html
The fwp post that presents the screwdriver operators also presents a few more
!-based operators.
Copyright 2010-2014 Philippe Bruhat (BooK).
This documentation is free; you can redistribute it and/or modify it under the same terms as Perl itself.