Какие действительно полезные, но эзотерические языковые возможности в Perl вы действительно смогли использовать для выполнения полезной работы?
Руководящие указания:
- Попробуйте ограничить ответы ядром Perl, а не CPAN
- Пожалуйста, приведите пример и краткое описание
Скрытые функции также можно найти на других языках. Скрытые функции:
(Это все из ответа Кориона )
- С
- Устройство Даффа
- Портативность и стандартность
- C #
- Кавычки для разделенных пробелами списков и строк
- Псевдонимные пространства имен
- Ява
- Статические Инициализаторы
- JavaScript
- Функции являются гражданами первого класса
- Блокировка объема и закрытия
- Вызов методов и методов доступа косвенно через переменную
- Рубин
- Определение методов через код
- PHP
- Распространенная онлайн документация
- Магические методы
- Символические ссылки
- питон
- Обмен значениями одной строки
- Возможность заменить даже основные функции своими собственными функциями
Другие скрытые возможности:
Операторы:
- Квазоператор bool
- Оператор триггера
- Также используется для построения списка
- И
++
унарные-
операторы работают на строках - Оператор повторения
- Оператор космического корабля
- || оператор (и // оператор), чтобы выбрать из набора вариантов
- Алмазный оператор
- Особые случаи
m//
оператора - Тильда-тильда "оператор"
Цитирование конструкций:
- Оператор qw
- Буквы могут использоваться в качестве разделителей кавычек в конструкциях, подобных q {}
- Механизмы цитирования
Синтаксис и имена:
- После сигил может быть пробел
- Вы можете дать суб числовые имена с символическими ссылками
- Юридические запятые
- Сгруппированные целочисленные литералы
- ломтики хеша
- Заполнение ключей хеша из массива
Модули, прагмы и параметры командной строки:
- используйте строгие и используйте предупреждения
- Проверка заражения
- Эзотерическое использование -n и -p
- CPAN
overload::constant
- IO :: Ручка модуля
- Безопасные отсеки
- Атрибуты
Переменные:
Петли и контроль потока:
Регулярные выражения:
Другие свойства:
- Отладчик
- Специальные кодовые блоки, такие как BEGIN, CHECK и END
DATA
блок- Операции с новым блоком
- Исходные фильтры
- Сигнальные Крючки
- карта ( дважды )
- Обтекание встроенных функций
eof
функцияdbmopen
функция- Превращение предупреждений в ошибки
Другие приемы и мета-ответы:
Смотрите также:
perl
hidden-features
Adam Bellaire
источник
источник
Ответы:
Оператор триггера полезен для пропуска первой итерации при циклическом просмотре записей (обычно строк), возвращаемых дескриптором файла, без использования переменной flag:
Запустите
perldoc perlop
и найдите «flip-flop» для получения дополнительной информации и примеров.источник
В Perl есть много неочевидных особенностей.
Например, знаете ли вы, что после сигил может быть пробел?
Или, что вы можете дать числовые имена подпрограмм, если вы используете символические ссылки?
Также есть квазиоператор "bool", который возвращает 1 для истинных выражений и пустую строку для ложных:
Другие интересные вещи:
use overload
вы можете перегрузить строковые литералы и числа (и, например, сделать их BigInts или что-то еще).Многие из этих вещей фактически где-то документированы или логически вытекают из документированных функций, но, тем не менее, некоторые из них не очень хорошо известны.
Обновление : еще один приятный. Ниже
q{...}
упоминались конструкции цитирования, но знаете ли вы, что вы можете использовать буквы в качестве разделителей?Также вы можете писать регулярные выражения:
источник
Добавить поддержку для сжатых файлов через магический ARGV :
(кавычки около $ _ необходимы для обработки имен файлов с метасимволами оболочки в)
Теперь
<>
функция распаковывает любые@ARGV
файлы, заканчивающиеся на «.gz» или «.Z»:источник
|
замены.zcat |
анализируется как команда для прохождения?@ARGV
Одной из моих любимых функций в Perl является использование логического
||
оператора для выбора из набора вариантов.Это означает, что можно написать:
занять первое истинное значение из
$a
,$b
и$c
, или значения по умолчанию в0
противном случае.В Perl 5.10 также есть
//
оператор, который возвращает левую часть, если она определена, и правую часть в противном случае. Следующие выбирает первый определяется значение из$a
,$b
,$c
, или в0
противном случае:Они также могут использоваться с их сокращенными формами, которые очень полезны для обеспечения значений по умолчанию:
Cheerio,
Павел
источник
Операторы ++ и унарные - работают не только с числами, но и со строками.
печатает -a
печатает б
печатает аа
источник
--
что не работает на струнах.ord()
. Или напишите небольшой класс и перегрузите операторы, чтобы сделать это за вас.Поскольку в Perl есть почти все «эзотерические» части из других списков, я скажу вам одну вещь, которую Perl не может:
Единственное, чего не может сделать Perl, - это иметь в своем коде произвольные URL-адреса, потому что//
оператор используется для регулярных выражений.На тот случай, если вам неясно, какие функции предлагает Perl, вот выборочный список, возможно, не совсем очевидных записей:
Устройство Даффа - в Perl
Переносимость и Стандартность - Есть , вероятно , больше компьютеров с Perl , чем с компилятором
Класс манипулирования файлами / путями - File :: Find работает даже в большем количестве операционных систем, чем .Net
Кавычки для списков и строк, разделенных пробелами - Perl позволяет вам выбирать почти произвольные кавычки для вашего списка и разделителей строк
Псевдонимные пространства имен - в Perl они имеют глобальные назначения:
Статические инициализаторы - Perl может запускать код практически на всех этапах компиляции и создания объектов, от
BEGIN
(синтаксического анализа кода) доCHECK
(после синтаксического анализа кода) доimport
(при импортеnew
объекта) вDESTROY
(уничтожение объекта) до (уничтожение объекта) доEND
(выход из программы)Функции являются гражданами первого класса - как в Perl
Область действия и закрытие блока - в Perl есть
Вызов методов и методов доступа косвенно через переменную - это делает Perl:
Определение методов с помощью кода - Perl также позволяет это :
Распространенная онлайн-документация - Perl-документация находится в сети и, вероятно, в вашей системе тоже
Магические методы, которые вызываются при вызове «несуществующей» функции - Perl реализует это в функции AUTOLOAD
Символические ссылки - вам настоятельно рекомендуется держаться подальше от них. Они будут есть твоих детей. Но, конечно же, Perl позволяет предлагать своих детей кровожадным демонам.
Обмен значениями на одну строку - Perl позволяет присваивать списки
Возможность заменить даже основные функции своими собственными функциями
или
источник
Автовивификация . AFAIK ни на одном другом языке его нет .
источник
Проще всего процитировать почти любую странную строку в Perl.
На самом деле, различные механизмы цитирования в Perl довольно интересны. Механизмы цитирования в стиле регулярных выражений Perl позволяют вам заключать в кавычки что угодно, указав разделители. Вы можете использовать практически любые специальные символы, такие как #, / или открывать / закрывать символы, такие как (), [] или {}. Примеры:
Механизмы цитирования:
q: буквальная кавычка; единственный символ, который должен быть экранирован, является конечным символом. qq: интерпретируемая цитата; обрабатывает переменные и экранирующие символы. Отлично подходит для строк, которые нужно процитировать:
qx: работает как qq, но затем выполняет ее как системную команду, а не в интерактивном режиме. Возвращает весь текст, сгенерированный из стандарта out. (Перенаправление, если поддерживается в ОС, также выходит) Также сделано с обратными кавычками (символ `).
qr: интерпретирует как qq, но затем компилирует его как регулярное выражение. Работает с различными опциями в регулярном выражении. Теперь вы можете передать регулярное выражение в качестве переменной:
qw: очень, очень полезный оператор цитаты. Превращает в кавычки набор слов, разделенных пробелами, в список. Отлично подходит для заполнения данных в модульном тесте.
Они великолепны, когда используют их, когда все проясняется. Для qx, qq и q я, скорее всего, использую операторы {}. Чаще всего люди, использующие qw, обычно используют оператор (), но иногда вы также видите qw //.
источник
my $moreout = qx{type "$path" 2>&1};
... Я не знал, что ты мог сделать это! [TM]Не совсем скрытый, но многие программисты Perl каждый день не знают о CPAN . Это особенно относится к людям, которые не являются программистами на полную ставку или не программируют на Perl.
источник
Оператор «for» можно использовать так же, как «with» в Pascal:
Вы можете применить последовательность операций s /// и т. Д. К одной и той же переменной, не повторяя имя переменной.
ПРИМЕЧАНИЕ. В неразрывном пространстве над (& nbsp;) скрыт Юникод, чтобы обойти уценку. Не копируйте, вставьте это :)
источник
Оператор цитаты - одна из моих любимых вещей. Для сравнения:
и
Гораздо меньше шума, легче для глаз. Еще одна очень приятная вещь в Perl, которую очень не хватает при написании SQL, это то, что завершающая запятая допустима:
Это выглядит странно, но не если вы сделаете отступ в коде другим способом:
Добавление дополнительного аргумента к вызову функции не требует от вас возиться с запятыми в предыдущих или конечных строках. Изменение одной строки не влияет на окружающие линии.
Это делает работу с переменными функциями очень приятной. Это, пожалуй, одна из самых недооцененных возможностей Perl.
источник
for (<a list of stuff>) { ... }
Возможность синтаксического анализа данных непосредственно вставить в DATA блока. Нет необходимости сохранять в тестовый файл, который будет открыт в программе или аналогичном. Например:
источник
Операции с новым блоком
Я бы сказал, что возможность расширения языка, создание псевдоблочных операций - одна из них.
Вы объявляете прототип для подпрограммы, указывающей, что она сначала берет ссылку на код:
Затем вы можете назвать это в теле так
(
Data::Dumper::Dumper
это еще один полупрозрачный камень.) Обратите внимание, что вам не нужноsub
ключевое слово перед блоком или запятая перед хешем. Это выглядит так:map { } @list
Исходные фильтры
Также есть исходные фильтры. Где Perl передаст вам код, чтобы вы могли им манипулировать. И то, и другое, и операции с блоками, в значительной степени не относятся к типу "не пытайся это дома".
Я сделал несколько полезных вещей с исходными фильтрами, например, создал очень простой язык для проверки времени, позволив коротким однострочникам Perl для принятия решения:
Lib::TL
будет просто сканировать как «переменные» и константы, создавать их и подставлять их по мере необходимости.Опять же, исходные фильтры могут быть грязными, но мощными. Но они могут испортить отладчикам что-то ужасное - и даже предупреждения могут быть напечатаны с неправильными номерами строк. Я перестал использовать Damian's Switch, потому что отладчик потерял бы всю способность говорить мне, где я на самом деле был. Но я обнаружил, что вы можете минимизировать ущерб, изменяя небольшие фрагменты кода, сохраняя их в одной строке.
Сигнальные Крючки
Это достаточно часто делается, но не все так очевидно. Вот обработчик кубика, который копилку на старом.
Это означает, что всякий раз, когда какой-то другой модуль в коде хочет умереть, он должен прийти к вам (если кто-то другой не сделает деструктивную перезапись
$SIG{__DIE__}
). И вы можете быть уведомлены, что кто-то считает что-то ошибкой.Конечно, для достаточного количества вещей вы можете просто использовать
END { }
блок, если все, что вы хотите сделать, это очистить.overload::constant
Вы можете проверять литералы определенного типа в пакетах, которые включают ваш модуль. Например, если вы используете это в вашем
import
сабе:это будет означать, что каждое целое число больше 2 миллиардов в вызывающих пакетах будет заменено на
Math::BigInt
объект. (Смотрите перегрузка :: константа ).Сгруппированные целочисленные литералы
Пока мы на этом. Perl позволяет разбивать большие числа на группы по три цифры и при этом получать из них целое разборное число. Обратите внимание
2_000_000_000
выше на 2 млрд.источник
->slice
метод как каждый раз, когда требуется срез.Двоичный «х» является оператором повторения :
Также работает со списками:
источник
Проверка порчи. С включенной проверкой заражения perl умрет (или предупредит, с
-t
), если вы попытаетесь передать испорченные данные (грубо говоря, данные извне программы) небезопасной функции (открытие файла, выполнение внешней команды и т. Д.). Это очень полезно при написании сценариев setuid или CGI, или чего-либо еще, где сценарий обладает большими привилегиями, чем тот, кто передает ему данные.Волшебный гото.
goto &sub
делает оптимизированный хвостовой вызов.Отладчик
use strict
иuse warnings
. Это может спасти вас от множества опечаток.источник
Основываясь на то , как
"-n"
и"-p"
коммутаторы реализованы в Perl 5, вы можете написать первый взгляд неправильную программу , включающую}{
:который конвертируется внутренне в этот код:
источник
Давайте начнем с оператора космического корабля .
источник
($a->lname cmp $b->lname) || ($a->fname cmp $b->fname)
сортирует людей по фамилиям, но если два человека имеют одинаковую фамилию, то они будут заказаны по имени.Это мета-ответ, но архивы Советов Perl содержат все виды интересных трюков, которые можно сделать с помощью Perl. Архив предыдущих советов доступен для просмотра в Интернете и может быть подписан через список рассылки или атомную ленту.
Некоторые из моих любимых советов включают создание исполняемых файлов с использованием PAR , использование autodie для автоматического генерирования исключений и использование конструкций switch и smart-match в Perl 5.10.
Раскрытие информации: я один из авторов и сопровождающих Perl Tips, так что я, очевидно, очень высоко ценю их. ;)
источник
map - не только потому, что он делает код более выразительным, но и потому, что он дал мне импульс прочитать немного больше об этом «функциональном программировании».
источник
Предложение продолжения для циклов. Он будет выполняться в нижней части каждого цикла, даже тех, которые находятся рядом.
источник
Мой голос был бы за (? {}) И (?? {}) группы в регулярных выражениях Perl. Первый выполняет код Perl, игнорируя возвращаемое значение, второй выполняет код, используя возвращаемое значение в качестве регулярного выражения.
источник
s/(pattern)/reverse($1);/ge;
# меняет всеpatterns
.uninames
,unichars
и особенноuniprops
видеть только часть того , что я имею в виду.Якорь \ G. Это горячее .
источник
У
m//
оператора есть несколько неясных особых случаев:?
в качестве разделителя, он совпадает только один раз, если вы не позвонитеreset
.'
в качестве разделителя, шаблон не интерполируется.источник
Нулевой указатель_на_файл оператор алмаза
<>
имеет свое место в создании инструментов командной строки. Он действует как<FH>
чтение из дескриптора, за исключением того, что он волшебным образом выбирает, что будет найдено первым: имена файлов командной строки или STDIN. Взято из перлопа:источник
perl myscript.pl file1.txt - file2.txt
, и Perl обработает первый файл, затем stdin, затем второй файл.overload
<>
<$var>
Специальные блоки кода , такие как
BEGIN
,CHECK
иEND
. Они приходят из Awk, но в Perl работают иначе, потому что они не основаны на записях.BEGIN
Блок может быть использован для указания код для фазы синтаксического анализа; это также выполняется, когда вы делаете проверку синтаксиса и переменнойperl -c
. Например, чтобы загрузить переменные конфигурации:источник
переименовывает data.txt.part в data.txt без необходимости повторяться.
источник
Немного неясен «оператор» тильды-тильды, который вызывает скалярный контекст.
такой же как
и отличается от
источник
~~
, который может выполнять сопоставление с регулярным выражением, может проверять, содержится ли элемент в массиве и так далее.tie, переменная привязка интерфейса.
источник
«Режим отчаяния» конструкций управления циклами Perl, который заставляет их искать в стеке, чтобы найти соответствующую метку, допускает некоторые любопытные поведения, которыми пользуется Test :: More, к лучшему или к худшему.
Есть малоизвестный файл .pmc. «use Foo» будет искать Foo.pmc в @INC до Foo.pm. Это было сделано для того, чтобы разрешить первую загрузку скомпилированного байт-кода, но Module :: Compile использует это для кэширования исходно отфильтрованных модулей для ускорения загрузки и отладки.
Возможность превращать предупреждения в ошибки.
Это то, что я могу придумать, что не было упомянуто.
источник
Оператор козла
*
:или
Это работает, потому что назначение списка в скалярном контексте дает количество элементов в списке, который назначается.
*
Обратите внимание, на самом деле не оператористочник