POD2-RU/lib/POD2/RU/perlsecret.pod
=encoding utf8
=head1 NAME/НАИМЕНОВАНИЕ
perlsecret - Cекретные операторы и константы Perl
=head1 КРАТКИЙ ОБЗОР
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}
=head1 ОПИСАНИЕ
Perl имеет давнюю традицию давать прозвища для некоторых из своих операторов
(возможная форма очеловечивания). Эти прозвища основаны
скорее на виде операторов, чем на их функциях.
Известные примеры I<бриллиантовый оператор> (C<< <> >>),
по прозвищу Стена Женевы и I<оператор космического корабля> (C<< <=> >>),
прозванный Рендаль Шварц.
Вот некоторые менее известные операторы Perl с ником I<толстая запятая>
(C<< => >>) и I<болтовня> (C<< ... >>).
"I<Cекретный операторы>" Perl были обнаружены (или созданы)
Perl обфускаторами и Perl гольфистами, обычно при поиске более короткого пути
выполнения операции.
Секретный операторы не являются на самом деле секретными, и они не являются на самом деле
операторами. Perl анализатор специально не признает их,
и не пытается скрывать их от вас.
Но они, являются операторами в том смысле, Perl программистам достаточно посмотреть
на их конструкцию, чтобы понять, что они делают, не задумываясь о более мелких элементах
и в конечном итоге добавляют их в свою коллецию инструментов.
Они являются секретами в том смысле, что они должны обнаружены
их будущем пользоватем (программистом), потому что они
явно не описаны в основной документации Perl.
Так как секретные операторы не являются операторами, они не имеют реальных имен, и
поэтому они нуждаются в прозвища (никнеймах).
Как видно из описания Perl операторов выше их имя обычно связано с их формой.
Термин "секретный оператор", вероятно, был придуман Абигейлом в
сообщении на C<comp.lang.perl.misc> в январе 2003 года.
=head2 Слово предупреждения
Многие из этих "операторов", не подходят для производственного кода,
потому что они являются неясными для непосвященных, хотя некоторые из них - это просто имена
для общих идиом (словосочетаний, фр. idiome «язык, наречие» происх от др.-греч. ἰδίωμα «особенность, своеобразие).
Реально секретные операторы используются гольфистами,
обфускаторами и людьми, которые любят
повеселиться с их любимым языком программирования.
Вы можете попробовать их дома, но они могут быть не безопасны для работы!
=head1 СЕКРЕТНЫЕ ОПЕРАТОРЫ
В следующем разделе представлены секретные операторы Perl с
некоторым историческим контекстом, объяснением того, как они работают и
примерами использования.
=head2 Венера(Venus)
0+
+0
Оператор I<Венера> - это очень распространенный фразеологизм. Он выполняет
превращение в цифру, нумификацию значения стоящего справа/слева
в зависимости от используемых версий. (Это достигается путем
использование идентификатора добавления I<+>).
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
Обратите внимание, что C<0+> — это имя метода, для "числового преобразования"
в модуле C<overload>.
=head2 Детская коляска (Baby cart)
@{[ ]}
Открыта Лари Воллом, 1994.
(Альтернативные клички: "шоппинг троллей", "коляска", "черепаха")
Оператор I<Детская коляска> выполняет интерполяцию списка внутри строки.
Элементы списка разделяются значением C<$">.
# 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"
Еще один вариант использования – для взлома алиасов (т.е. создании копии); Например,
чтобы избежать фатальной ошибки при C<попытке модификации значения только для чтения>
при выполнении следующего кода:
for (qw( 1 2 3 )) {
$_ = $_ * $_; # надуманный
print "площадь: $_\n";
}
С детской коляской (babycart) изменяемые данные фактически копируются в скаляр.
for ( @{[ qw( 1 2 3 ) ]} ) {
$_ = $_ * $_; # надуманный
print "площадь: $_\n";
}
Это I<контейнер>, или I<окаймляющий> (I<циркумфикс>) operator. Выражение внутри
C<[]> выполняется в списочном контексте и сохраняется в анонимном массиве,
который сразу разыменовывается с помощью C<@{}>.
Вы это иногда увидите это в рабочем коде.
=head2 2 удара Bang bang
!!
Этот оператор был в общем использовании программистами C даже до существования Perl.
Он выполняет логическое преобразование, выполняя логическое отрицание
дважды.
my $true = !! 'a string'; # теперь 1
my $false = !! undef; # теперь ''
=head2 Приветствие Эскимосов (Eskimo greeting)
}{
(Альтернативный ник: "бабочка")
Открыт Абигалем в 1997.
Оператор I<приветствие Эскимосов> является блоком C<END> для однострочников.
Следующая программа подсчитывает и выводит число строк во входных данных:
$ perl -lne '}{print$.'
Приветствие Эскимосов злоупотребляет использование опций B<-p> и B<-n> генерируя
Perl код (показано, используя модуль C<B::Deparse>):
$ perl -MO=Deparse -lne '}{print$.'
-e syntax OK
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
}
{
print $.;
}
Открытие было сделано после того, как Perl Journal опубликовал интервью с
Чипом Сальзенбергом(Chip Salzenberg), в котором он объяснил, что хак perl использует для реализации
C<< -p >> и C<< -n >>.
Этнографическое примечание: в современной Западной культуре эскимосский поцелуй - это
, когда люди целуются друг с другом соприкасая носы. Это основывается
на традиционном инуитском приветствии, названном I<куник>, ранние исследователи
Арктики назвали его "эскимосский поцелуй" ("Eskimo kissing"), когда они впервые увидели его.
Сам куник не является поцелелуем, он не эротичен, это просто форма нежного приветствия.
=head2 Дюймовый_червь (Inchworm)
~~
Этот оператор в основном короче C<scalar>(убирает целых 4 символа!)
используя ту же идею, как секретный оператор bang bang.
$ perl -Esay~~localtime
Tue Mar 13 19:53:25 2012
Дюймочервь выглядит очень похоже на смарт матч оператор, представленный
в Perl 5.10, но так как это на самом деле последовательность двух унарных операторов,
анализатор Perl не сможет смешать его с двоичным смарт матчем.
Обратите внимание, что Perl C<~> является чувствительным операндом: если его операнд имеет числовое
значение (либо потому, что был присвоен номер, в результате числовая
операция, или используется в числовом контексте), это побитовое числовое
отрицание (сначала неявно преобразует целое число без знака (unsigned integer (UV)), или
за областью C<use L<integer>>, знаковое целое число, (signed integer (IV))); в противном случае это
строковое поразрядное(побитовое) отрицание.
И это объясняет, как эта операция отличается от C<!!>. Вместо того, чтобы заставить операнд
быть булевым (логическим), он применяет его или к строке или к цифре(в зависимости от операндов).
Таким образом, для большинства входных данных, Дюймочервь (inchworm) действует так же, как C<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 };
=head2 Дюймочервь на палке (Inchworm on a stick)
~-
-~
Открыт Томом Хоспелом, 2002.
Эти два оператора выполняют высокоприоритетный декремент (C<~->) и
высокоприоритетный инкремент(C<-~>) для целых чисел (на архитектуре
дополнительного кода ( two-complement)
https://ru.wikipedia.org/wiki/Дополнительный_код_(представление_числа)).
Этот трюк программисты языка ассемблера использую на протяжении десятилетий.
В C, Python и Ruby они работают на всех целых числах. Из-за того, как оператор C<~>
реализован в Perl (мало известный факт, что побитовые
операторы Perl приводят операнд к беззнаковому целому ( unsigned integers)
без C<use L<integer>> и к знаковому целому (signed integers)
с C<use integer>), эта пара
секретных операторов ограничивается целыми числами со знаком.
Это на самом деле еще большее ограничение, по умолчанию: C<~-> только уменьшает целые числа
больше 0 и C<-~> только увеличивающем целые числа меньше 0. Для того, чтобы
Дюймочервь на палке (Inchworm on a stick)
работал на всех целых числах, он должен быть использован
в сфере C<use integer>, таким образом знаковые целые(signed integers)
используются повсеместно в битовых операциях.
Этот гольф методика позволяет избавиться от пары скобок:
$y = ~-$x * 4; # аналогично $y = ($x-1)*4;
Вот доказательство:
$x - 1 == - ( -$x ) - 1
В двудополнительной архитектуре, чтобы получить обратное числа,
все, что вам нужно сделать это сделать инверсию (flip) всех битов и добавить 1. То есть,
-$i == ~$i + 1
Используем это, чтобы заменить C< - ( -$x ) > на показанное выше, мы получаем:
$x - 1 == ( ~-$x + 1 ) - 1
И после устранения единиц из уравнения,
$x - 1 == ~-$x
ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ. (QED - от лат. quod erat demonstrandum)
Для C<-~>, доказательство аналогично:
$x + 1 == - ( -$x ) + 1
$x + 1 == - ( ~$x + 1 ) + 1
$x + 1 == -~$x - 1 + 1
$x + 1 == -~$x
В обеих версиях высокий приоритет исходит из того, что C<~>
и унарный C<-> оба имеют более высокий приоритет, чем все другие арифметические
операторы (за исключением C<**>).
Мнемосхема: назад стоящий дюймочервь на палке(C<~->) уменьшает,
а дюймочервь по ходу движения на палке (C<-~>) приращяет.
=head2 Космическая станция (Space station)
-+-
Открыт Алистером Макглинчи, 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 Нет такого файла или каталога
Во-первых это выглядит точно как оператор Венеры. Однако, потому что
оператор Венеры использует двоичный C<+>, он имеет более низкий приоритет, чем
операторы умножения, такие как как C<*> или C<x>.С другой стороны
оператор космической станции является объединением трех унарных операторов,
и поэтому имеет более высокий приоритет.
В следующем примере мы будем пытаться печатать приведнную к цифре строку
C<'20GBP'> (т.eе C<'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 <+> строки
их аналогом, космическая станция B<не> переводит в цифры I<строки, начинающиеся с минуса>
или I <строки, которые не начинаются с числа>:
print -+- 'two cents'; # +two cents
print -+- '-2B' x 5; # -2B-2B-2B-2B-2B
В примере выше, C<-+- '-2B'> производит строку C<'-2B'>,
в то время как C<0+ '-2B'> дал бы ожидаемое число (C<-2>).
=head2 Гоатсе, Коза (Goatse)
=( )=
(Еще одно имя: "Сатурн")
Если вы не понимаете имя этого оператора, считайте себя счастливчиком.
Вам рекомендуется B<не> искать его в Интернете для визуального объяснения.
Оператор гоатсе предоставляет списочный контекст его правую сторону и
возвращает количество элементов на ее левой стороне.
Обратите внимание, что левая сторона должна обеспечивать скалярный контекст; очевидно списочный
контекст с левой стороны будут получать пустой список в середине.
Объяснение того, что присвоение списка в скалярном контексте возвращает
количество элементов в правой части назначения, независимо от
как много из этих элементов были на самом деле присваивоены переменным. В этом
случае все элементы справа просто передают пустой список
(и поэтому отбрасываются).
# считает число слов в $_
$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;
В некоторых случаях полный гоатсе не нужен, потому что нет необходимости
для хранения значения в переменной. Побочный эффект списочного присвоения в
скалярные контексте может быть получен I<правостороннем гоатсе> (C<()=>)
используемый в скалярных контексте имеет другое значение, чем присвоение
скаляру.
Например:
# удаление пустых ссылок на массивы
@arrays = ( [], [1], [ 1, 2 ], [], [ 5 .. 9 ] );
# @filled = ( [1], [ 1, 2 ], [ 5 .. 9 ] );
@filled = grep +()= @$_, @arrays;
(C<+> в строке выше не операция, используется, что сказать C<grep>,
что скобки не включают его аргументы.)
Вот запутанный пример, где C<=()=> , представляется, как соответствующей
конструкцией для использования, но это на самом деле еще один секретный оператор,
в действительности это трюк.
Представьте, что вы хотите знать, на сколько элементов C<< split() >> разобьет
строку, но не заботится о самих элементах. Используйте C<< split() >>
в скалярных контексте:
my $count = split /:/, $string;
Дает правильный ответ, но и предупреждение:
Use of implicit split to @_ is deprecated
Использование неявного сплита для @_ не рекомендуется
Использование C<=()=> для приведения к скалярному контексту на левой стороне (чтобы получить число
подстрок) и списочный контекст на правой стороне (чтобы избежать устаревшую
конструкцию не в списочном контексте) кажется, вот правильное решение:
my $count =()= split /:/, $string;
Она действительно не предупреждает, но всегда возвращает C<1>(что вообщето неправильно).
Причина того, что C<split()> никогда не разбивается больше полей, чем необходимо.
И компилятор интерпретирует, сохранение результатов в C<()> , не заботясь о
о результатах, так C<split()> не будет B<разбивать строку на всё>,
и таким образом вернуть полную строку, которая дает список только одного элемента
в скалярном контексте, следовательно C<1>.
У вас есть два варианта решения этой проблемы. Во-первых можно переопределить C<split()>
оптимизацию, явно задавая его разделить на неограниченное число
полей:
my $count =()= split /:/, $string, -1;
Или же вы можете победить оптимизации с помощью другого секретного оператора
вместо этого I<детской коляской>:
my $count = @{[ split /:/, $string ]};
Это понуждает C<split()> обнаружить, что вызывающий объект может хранить любое количество
полей, таким образом он будет на самом деле делать работу до того, как анонимный
массив выбрасывается после использования в скалярном контексте.
=head2 Пылающий X-Wing Истребитель (Flaming X-Wing)
=<>=~
Открыт Филиппом Брюа, 2007.
Этот оператор применяет регулярное выражение к одной строке ввода
и назначает захваченных значения в выражение на его левой стороне.
# поймать имена полей из входящего потока (input)
@data{@fields} =<>=~ $regexp;
Объясняетя вышеназванное выражение: C<=~> обеспечивает скалярный контекст
для левой стороны C<< <> >> таким образом, что ищет во входящей строке.
Если регулярное выражение содержит захваты, имеющие структуру массива
с левой стороны, C<=> обеспечивает списочный контекст и
захваченные данные назначаются структуре.
Этот оператор также является контейнером. Поэтому X-Wing может иметь пилота!
# используй исходный текст, Люк!
$luke = \*DATA;
@data{@fields} =<$luke>=~ $regexp;
=head2 Кайт (Kite)
~~<>
Открыт Филиппом Бруа, 2012.
(Альтернативное название: "сперматазоид")
Этот оператор на самом деле сочетание Дюймочервя и бриллиантового
оператора. Он обеспечивает скалярный контекст встроенному C<readline()>, таким образом,
возвращая одну строку ввода.
Это полезно только в списочном контексте (так как C<< <> >> уже возвращает
единую линию ввода в скалярном и пустом контекстах), например, для получения
сразу несколько линий:
@triplets = ( ~~<>, ~~<>, ~~<> ); # три спермы в одно яйцо?
Как и другие операторы, основанные на скобочных конструкциях , кайт
контейнер и может нести полезную нагрузку (в данном случае, дескриптор файла).
Обратите внимание, что когда дескриптор файла дочитан до конца, оператор кайт будет
возвращать пустую строку вместо C <undef>.
Мнемоника: Он обеспечивает функцию, которая привязана к одной строке, строке,
как она была. (Tye Маккуин в L<http://www.perlmonks.org/?node_id=959906>).
=head2 Богатый двухлезвийный меч (Ornate double-bladed sword)
<<m=~m>>
m
;
Создан Абигалем, 2003, for comp.lang.perl.misc.
Этот оператор обеспечивает многострочные комментарии, путем разумного использования
heredoc-синтаксиса и красивой симметрии.
Цитата C<< <slrnb382jc.tfm.abigail@alexandra.abigail.nl> >>:
<<m=~m>>
Используйте тайный оператор в предыдущей строке.
Запишите ваши комментарии здесь.
Много и много комментов.
Вы даже можете использовать пустые строки.
Закончим с одной
m
;
"Орнамент" C<m> ленты с C<;> бросает меч, привязанный к нему.
Обратите внимание, что "комментируемый" текст на самом деле строка в двойных кавычках в
пустом контексте, что может иметь некоторые побочные эффекты.
=head2 Отверточный оператор (Screwdriver)
Открыт Дмитрием Карасиком, 2007, при поиске операторов, основанных на знаке C<!>.
Все отверточные операторы являются условными операторами. Как отвертки,
они приводятся к 4м основным типам, с различными длинами ручек.
=over 4
=item *
Плоская
-=!!
-=!
Этот оператор обеспечивает условное уменьшение:
$x -=!! $y # $x-- if $y;
$x -=! $y # $x-- unless $y;
=item *
Прямоугольная
+=!!
+=!
Этот оператор обеспечивает условное увеличение:
$x +=!! $y; # $x++ if $y;
$x +=! $y; # $x++ unless $y;
=item *
Шестилучевая
*=!!
*=!
Этот оператор обеспечивает условный сброс на C<0>:
$x *=!! $y; # $x = 0 unless $y;
$x *=! $y; # $x = 0 if $y;
Оператор шестилучевая отвертка не работает должным образом с отрицательными числами
отличными от C<-1> на Perl версии ниже или равно, чем 5.13.5.
Он также не удается с C<-1> на Perl версии ниже или равной 5.7.0.
=item *
Крестовая
x=!!
x=!
Этот оператор обеспечивает условный сброс на C<''>:
$x x=!! $y; # $x = '' unless $y;
$x x=! $y; # $x = '' if $y;
(Это один был обнаружен Филиппом Брюа в 2009 году, при подготовке
лекции о тайных (секретных) операторах.)
=back
Мнемоника: головка отвертки является лучшим мнемоникой ческие (C<-> and C<+>
для инкремента и декремента, C<*> для несуществующего значения (null), C<x> для пустой строки).
=head2 Подмигивающая жирная запятая (Winking fat comma)
,=>
Открыта Абигалем, 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 <,> является выключателем для жирной запятой в ее стрингификации (приведении к строке).
=head2 Предприятие (Enterprise)
( )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},
);
Этот оператор представляет собой контейнер, а это значит, предприятие может иметь
большой экипаж.
Предприятие это просто повторение списочного оператора C<< ()x >>
затем логическое значение (см L<Bang bang> L<Двойной удар> оператор выше), который будет
интерпретируется как 1 или 0 в числовом контексте.
Следует отметить, что выражение слева всегда выполняется, независимо от условия.
Из-за вопросов приоритета, сложных условиях в конце
оператора ентерпрайз (предприятия) может потребоваться поставить в скобки.
=head2 Ключ к истине (Key to the truth)
0+!!
Обнаружен Тоби Инкстер, 2013.
Этот оператор - комбинация операторов Венеры (Venus), и двойного удара(bang bang).
Он просто превращает логическую ложь числовое значение C<0>.
my $true = 0+!! 'a string'; # теперь 1
my $false = 0+!! undef; # теперь 0
=head2 Эбботт и Костелло Камеди дуэт
||()
Обнаружен Ивом Ортоном.
Этот оператор делает ложное значение исчезающим в списочном контексте.
Он просто заменяет ложный скаляр пустым списком.
my @shopping_list = (
'bread',
'milk',
$this ||(),
$that ||(),
'apples'
);
Мнемоника: один высокий, (а также "прямой человек") и один жирный,
, как в известном комедийном дуэте.
=head2 Наклонный Эбботта и Костелло
//()
Предложен Дэмиеном Кроткиным, 2014.
Этот оператор работает точно так же, как L<Эбботт и Костелло> , за исключением
того, что он только делает C<undef> исчезающим в списочном контексте.
Этот оператор работает только в версиях Perl 5.10 выше.
Мнемоника: в этой версии, "прямой человек" склоняется
(и, поэтому, реальная ассоциативность "(склюняющийся Эботт) и Костелло" ).
=head1 СЕКРЕТНЫЕ КОНСТАНТЫ
=head2 Космический флот (Space fleet)
<=><=><=>
Открыт Домианом Конвеем.
Даже несмотря на то, что он выглядит как последовательность из трех космических кораблей,
только средний корабль является фактическим кораблем. Два внешних "корабля"
являются на самом деле вызовом C<glob("=")>.
Эта константа имеет значение C<0>.
=head2 Амфисбена Двойной путь (Amphisbaena)
<~>
Обнаружил Рафаэль Гарсия Суарес, 2009.
Под Unix будет равна в домашнему каталогу пользователя (с помощью C <glob>).
На Win32 он будет расширять C<$ENV{HOME}>, если он установлен (что является довольно редко)
или возвратит C<'~'>.
=head1 АВТОР
Филипп Брюа (книга)
=head1 БЛАГОДАРНОСТИ
Автор хотел бы поблагодарить 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 вдохновения, предложений и патчей.
=head1 СПОСОБСТВОВАНИЕ
Если вы знаете другие тайные операторы и константы, пожалуйста, дайте мне знать!
Однако, прежде чем отправить мне ваше последнее творение, следует знать, что, хотя
они устанавливаются не в камне, я считаю следующие критерии до
добавление оператора или константы в этот список:
=over 4
=item *
имеет ли он ник? (обычно такое, которое соответствует его художественной ASCII форме),
=item *
используется ли он на самом деле в дикой природе?
=item *
имеет ли он гольф-специфичный интерес? (т.е. он выполняет некоторые полезные
операция в значительно меньше числе символов, чем "нормального" Perl код?)
=item *
имеет ли он исторический интерес?
=back
=head1 ССЫЛКИ
Как показано ниже, большинство действий секретных операторов происходит
в веселом списке рассылки Perl.
=over 4
=item *
В 1993 году, по словам Рэндала Шварца в его "I<Мои пол-жизни с Perl>" ("I<My half-life with Perl>")
25 июля 2013 на OSCON был доклад:
I<Дочь Ларри (Женева?) названный E<lt>E<gt> оператор для меня (Я назвал E<lt>=E<gt>)>
I<Larry's daughter (Geneva?) named the E<lt>E<gt> operator for me (I named the E<lt>=E<gt>)>
=item *
Post C<< <1994May1.035104.25990@netlabs.com> >> in C<comp.lang.perl>
Ларри Уолл обнаруживает детскую коляску и описывает ее, как «путь,
интерполирующий результаты функции в строку".
=item *
Сообщение C<< <slrnb382jc.tfm.abigail@alexandra.abigail.nl> >> in C<comp.lang.perl.misc>
Абигейл вводит термин "секретный оператор", чтобы описать C<< <<m=~m>> m ; >>.
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2005/02/msg3691.html>
Оригинальное обсуждение "секретных операторов".
Несколько из подробных объяснений на этой странице пришли из этого обсуждения.
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2005/02/msg3708.html>
Описание оператора космической станции.
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2005/02/msg3712.html>
Филипп Брюа использует слово "Венера"("venus"), чтобы описать C<0+>.
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2006/07/msg3855.html>
Именование оператора детксая коляска(baby cart).
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2006/07/msg3891.html>
Аристотель Пэгэлцис объясняет, как детская коляска может использоваться, чтобы сломать совмещение имен(break aliasing).
=item *
L<http://www.perlmonks.com/?node_id=564792>
I<Секретные Операторы Perl: логический оператор список сквош, x!!>,
Аристотель Пэгэлцис, описывает оператор предприятия(энтерпрайз).
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2007/11/msg4006.html>
Описание тайного оператора пылающий X-Wing.
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2007/11/msg4028.html>
Описание операторов отвертки и других, основанных на символе C<!>.
=item *
L<http://www.nntp.perl.org/group/perl.golf/2009/06/msg2524.html>
Описание четвертого оператора отвертки (позидрайв - крестовой).
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2012/03/msg4169.html>
Описание оператора спермы/кайт.
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2012/04/msg4192.html>
Предложение по дополнительному, благоприятному для семьи, нику для оператора гоатсе
, со вторым набором шуток внутри.
=item *
Эбботт и Костелло оператор был впервые представлен мне 2013-09-25
Ивом Ортоном в личных сообщениях.
Я пытался предложить «Лорел и Харди» как более международную и понятную
альтернативу, но оказывается Харди I<оба> жирные и
высокие в одном лице.
=item *
Ключ к оператору правды был описан мне 2013-09-28
Тоби Инкстером на C<#moose> IRC канале и в личных сообщениях.
=item *
2014-02-18, на C<#perlfr> IRC канале, Дамиан Кроткин отмечает, что
он использует C<//()> чаще, чем C<||()>, на который отвечает Филипп Брюа
немедленно с именем "Наклоняющийся Аббат и Костелло", отмечая это
Аббат - высокий.
=back
Более тайные операторы не попали в этот список, потому что у них
пока нет имени.
=over 4
=item *
L<http://www.nntp.perl.org/group/perl.fwp/2007/11/msg4028.html>
Пересылка сообщения, которое представляет отверточные операторы, также представляет
несколько больше операторов, основанных на C<!>.
=back
=head1 АВТОРСКОЕ ПРАВО
Copyright 2010-2014 Philippe Брюа (книга).
=head1 ЛИЦЕНЗИЯ
Эта документация предоставляется бесплатно; вы можете распространять её и/или изменить её
на тех же условиях как и сам Perl.
=head1 ПЕРЕВОДЧИКИ
=over
=item * Николай Мишин C<< <mishin@cpan.org> >>
=back