Скрытые возможности Perl?

Самый быстрый и простой способ, с помощью которого я смог найти отличную игру Вью и Электрона, - это электронный строитель .

Чтобы использовать, настройте проект с Vue CLI3, используя

vue create my-project

, затем CD в этот каталог, в данном случае «my-project», и запустите

[ 119] vue add electron-builder

Это устанавливает базовые леса, которые позволяют Vue и электрону играть хорошо с самого начала. Вы можете проверить свою работу, запустив не построенную тестовую версию, используя

npm run electron:serve

и, когда вы будете готовы к развертыванию, можете использовать

npm run electron:build

строить. Это значительно упрощает процесс, который можно увидеть в других местах, когда вы работаете с гигантским, а не спроектированным шаблоном или пытаетесь записать относительный путь, чтобы ваши сборки и среды разработки работали одинаково.

143
задан 26.09.2017, 09:53

49 ответов

Триггерный оператор полезен для пропуска первого повторения когда цикличное выполнение через записи (обычно строки) возвращенный дескриптором файла, не используя переменную флага:

while(<$fh>)
{
  next if 1..1; # skip first record
  ...
}

Выполнение perldoc perlop и поиск "триггера" для получения дополнительной информации и примеров.

54
ответ дан 21.09.2019, 14:29
  • 1
    На самом деле that' s взятый от Awk, где можно сделать триггер между двумя шаблонами путем записи pattern1, pattern2 – Bruno De Fraine 03.10.2008, 02:50
  • 2
    Разъясниться, " hidden" аспект этого то, что если любой операнд к скаляру '..' константа, которая значение неявно по сравнению с входным номером строки ($). – Michael Carman 03.10.2008, 03:41

Проверка инфекции. С включенной проверкой инфекции жемчуг умрет (или предупредит, с -t), при попытке передать испорченные данные (примерно разговор, данные снаружи программы) к небезопасной функции (открытие файла, выполнение внешней команды, и т.д.). Очень полезно при записи setuid сценариев или CGIs или чего-либо, где сценарий имеет большие полномочия, чем человек, подающий его данные.

Волшебство goto. goto &sub делает оптимизированный последний вызов.

отладчик.

use strict и use warnings. Они могут сохранить Вас от набора опечаток.

24
ответ дан 21.09.2019, 14:29
  • 1
    Почему don' t другие языки имеют эту функцию? Эта использованная функция делает веб-сценарии жемчуга порядком величины более безопасный. – Matthew Lock 03.12.2009, 18:25
  • 2
    +1 для ' taint' проверка. хихикайте! – temp2290 30.01.2010, 04:46

Давайте запустимся легкий с Оператор .

$a = 5 <=> 7;  # $a is set to -1
$a = 7 <=> 5;  # $a is set to 1
$a = 6 <=> 6;  # $a is set to 0
Космического корабля
18
ответ дан 21.09.2019, 14:29
  • 1
    That' s едва тайный! – Leon Timmermans 03.10.2008, 02:16
  • 2
    @Leon: C/C++ doesn' t делают 3 возврата значения для чисел. Если не изменяет память, Строка выдерживает сравнение, функции являются только 3 возвратами значения, о которых я знаю на целом языке STL. AFAIK Python doesn' t имеют 3 числовые возврата, выдерживают сравнение. Java doesn' t имеют число, которое определенные 3 возврата сравнивают также. – J.J. 03.10.2008, 04:53
  • 3
    It' s стоящий упоминания what' s настолько полезный о-1/0/1 операторах сравнения, с тех пор не все могли бы знать: можно объединить их в цепочку вместе с или-оператором, чтобы сделать основной/вторичный/и т.д. виды. Так ($a->lname cmp $b->lname) || ($a->fname cmp $b->fname) люди видов их фамилиями, но если у двух человек есть та же фамилия тогда, им закажет их имя. – hobbs 27.07.2010, 01:13
  • 4
    @J.J. Python действительно имеет с 3 значениями, сравните: cmp () > > > печать (cmp (5,7), cmp (6,6), cmp (7,5)) (-1, 0, 1) – bukzor 29.07.2010, 14:53

Двоичный файл "x" оператор повторения:

print '-' x 80;     # print row of dashes

Это также работает со списками:

print for (1, 4, 9) x 3; # print 149149149
24
ответ дан 21.09.2019, 14:29
  • 1
    Это - одна причина, почему Perl был так популярен у хакеров. жемчуг-e ' 0x000 x 25' печати;; – J.J. 03.10.2008, 05:28
  • 2
    Это также работает со списками: печать для (1, 4, 9) x 3 – dland 03.10.2008, 06:47
  • 3
    Мое любимое использование для этого генерирует заполнителей для последней части оператора INSERT SQL: @p = ('? ') x $n; $p = соединение (" " @p); $sql = " ВСТАВИТЬ... ЗНАЧЕНИЯ ($p) "; – skiphoppy 04.10.2008, 06:20

На основе пути "-n" и "-p" переключатели реализованы в Perl 5, можно записать на вид неправильную программу включая }{:

ls |perl -lne 'print 

На основе пути "-n" и "-p" переключатели реализованы в Perl 5, можно записать на вид неправильную программу включая }{:

[110]

, который преобразовывается внутренне в этот код:

LINE: while (defined(

На основе пути "-n" и "-p" переключатели реализованы в Perl 5, можно записать на вид неправильную программу включая }{:

[110]

, который преобразовывается внутренне в этот код:

[111] = <ARGV>)) { print

На основе пути "-n" и "-p" переключатели реализованы в Perl 5, можно записать на вид неправильную программу включая }{:

[110]

, который преобразовывается внутренне в этот код:

[111]; }{ print "$. Files"; }
; }{ print "$. Files"'

, который преобразовывается внутренне в этот код:

LINE: while (defined(

На основе пути "-n" и "-p" переключатели реализованы в Perl 5, можно записать на вид неправильную программу включая }{:

[110]

, который преобразовывается внутренне в этот код:

[111] = <ARGV>)) { print

На основе пути "-n" и "-p" переключатели реализованы в Perl 5, можно записать на вид неправильную программу включая }{:

[110]

, который преобразовывается внутренне в этот код:

[111]; }{ print "$. Files"; }
22
ответ дан 21.09.2019, 14:29

Способность проанализировать данные, непосредственно вставляемые в ДАННЫЕ блок. Никакая потребность сохранить в тестовый файл, который будет открыт в программе или подобный. Например:

my @lines = <DATA>;
for (@lines) {
    print if /bad/;
}

__DATA__
some good data
some bad data
more good data 
more good data 
26
ответ дан 21.09.2019, 14:29
  • 1
    Это очень ужасно. – Hai 07.01.2010, 09:12
  • 2
    И очень полезный в небольших тестах! – fengshaun 09.06.2010, 20:13
  • 3
    @peter mortensen, как у Вас было бы несколько блоков? И как Вы заканчиваете блок? – Toad 02.10.2010, 07:55
  • 4
    @Toad: это - allan' s ответ (см. список пересмотра). Лучше обратиться к тому пользователю. Или, поскольку тот пользователь оставил Переполнение стека, возможно, ни к кому не обратитесь в особенности (таким образом, настоящий эксперт по Perl может выяснить его позже). – Peter Mortensen 02.10.2010, 08:25
  • 5
    @Hai: Нет это не ужасный — на самом деле, it’s точно противоположность ужасных: it’s, чистый, стройный, минимальный, и красивый; одним словом, замечательными it’s, и языки без него является ЛАВАШ. @peter mortensen, @toad: Один ответ на то, как иметь несколько блоков данных в той же программе, должен использовать эти Встроенный:: Файлы модуль от CPAN. – tchrist 12.11.2010, 03:26

Новые Блочные операции

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

  1. Вы объявляете прототип для sub указание, что он берет ссылку кода сначала:

    sub do_stuff_with_a_hash (&\%) {
        my ( $block_of_code, $hash_ref ) = @_;
        while ( my ( $k, $v ) = each %$hash_ref ) { 
            $block_of_code->( $k, $v );
        }
    }
    
  2. можно тогда звонить, это в теле как так

    use Data::Dumper;
    
    do_stuff_with_a_hash {
        local $Data::Dumper::Terse = 1;
        my ( $k, $v ) = @_;
        say qq(Hey, the key   is "$k"!);
        say sprintf qq(Hey, the value is "%v"!), Dumper( $v );
    
    } %stuff_for
    ;
    

(Data::Dumper::Dumper другое полускрытое сокровище.) Уведомление, как Вам не нужно sub ключевое слово перед блоком или запятая перед хешем. Это заканчивает тем, что смотрело много как: map { } @list

Фильтры источника

кроме того, существуют фильтры источника. Куда Perl передаст Вас код, таким образом, можно будет управлять им. И это и блочные операции, являются в значительной степени don't-try-this-at-home типом вещей.

я сделал некоторые аккуратные вещи с фильтрами источника, например, как создание очень простого языка для проверки времени, позволив короткие остроты Perl для некоторого принятия решений:

perl -MLib::DB -MLib::TL -e 'run_expensive_database_delete() if $hour_of_day < AM_7';

Lib::TL просто просканировал бы и для "переменных" и для констант, создал бы их и заменил бы ими по мере необходимости.

Снова, фильтры источника могут быть грязными, но мощны. Но они могут смешать отладчики что-то ужасное - и даже предупреждения могут быть распечатаны с неправильными номерами строки. Я прекратил использовать Damian Переключатель , потому что отладчик потеряет всю способность сказать мне, где я действительно был. Но я нашел, что можно минимизировать повреждение путем изменения маленьких разделов кода, хранения их на той же строке.

Рычаги Сигнала

Это часто достаточно делается, но это не все это очевидное. Вот умереть обработчик что свиные спины на старой.

my $old_die_handler = $SIG{__DIE__};
$SIG{__DIE__}       
    = sub { say q(Hey! I'm DYIN' over here!); goto &$old_die_handler; }
    ;

, Который означает каждый раз, когда некоторый другой модуль в коде хочет умереть, они должны прибыть к Вам (если кто-то еще не делает разрушительную перезапись на $SIG{__DIE__}). И Вы можете быть уведомлены, что кто-то вещи что-то - ошибка.

, Конечно, для достаточного количества вещей можно просто использовать END { } блок, если все, что Вы хотите сделать, является уборкой.

overload::constant

можно осмотреть литералы определенного типа в пакетах, которые включают модуль. Например, если Вы используете это в Вашем import sub:

overload::constant 
    integer => sub { 
        my $lit = shift;
        return $lit > 2_000_000_000 ? Math::BigInt->new( $lit ) : $lit 
    };

это будет означать, что каждое целое число, больше, чем 2 миллиарда в пакетах вызова, будет изменено на Math::BigInt объект. (См. перегрузка:: постоянный ).

Сгруппированные Целочисленные Литералы

, В то время как мы в нем. Perl позволяет Вам разбивать большие количества в группы из трех цифр и все еще вытаскивать parsable целое число из него. Примечание 2_000_000_000 выше для 2 миллиардов.

24
ответ дан 21.09.2019, 14:29
  • 1
    Когда использование $SIG { УМИРАЕТ } обработчики, его настоятельно рекомендуемый, который Вы осматриваете $ ^S, чтобы видеть, умирает ли Ваша программа на самом деле, или просто выдача исключения, которое будет пойманным. Обычно Вы don' t хотят вмешаться в последнего. – pjf 03.10.2008, 12:25
  • 2
    Да. Я обычно делаю это. И that' s положительная сторона. – Axeman 03.10.2008, 19:58
  • 3
    Новый блок очень поучителен! Я думал, что Это был семантический язык! большое спасибо. – ZeroCool 04.01.2010, 07:40
  • 4
    Поучительное использование фильтра источника является pdl' s NiceSlice ( pdl.perl.org/?docs=NiceSlice&title=PDL::NiceSlice ) так, чтобы один doesn' t должен использовать ->slice в качестве метода каждый раз, когда часть необходима. – Joel Berger 08.05.2011, 17:08

quoteword оператор является одной из моих любимых вещей. Сравните:

my @list = ('abc', 'def', 'ghi', 'jkl');

и

my @list = qw(abc def ghi jkl);

Намного меньше шума, более симпатичного. Другая действительно хорошая вещь о Perl, что каждый действительно отсутствует при записи SQL, состоит в том, что запаздывающая запятая законна:

print 1, 2, 3, ;

, Который выглядит нечетным, но не, если Вы располагаете код с отступом иначе:

print
    results_of_foo(),
    results_of_xyzzy(),
    results_of_quux(),
    ;

Добавление дополнительного аргумента вызову функции не требует, чтобы Вы возились с запятыми на предыдущих или запаздывающих строках. Однострочное изменение не оказывает влияния на свои окружающие строки.

Это делает очень приятным работать с функциями variadic. Это - возможно, одна из наиболее недооцененных функций Perl.

26
ответ дан 21.09.2019, 14:29
  • 1
    Интересный угловой случай Perl' s синтаксис то, что следующее допустимо: за $ _ QW (список материала) {...} – ephemient 03.10.2008, 17:21
  • 2
    Можно даже злоупотребить синтаксисом шарика для заключения в кавычки слов, пока Вы don' t используют специальные символы такой в качестве *?. Таким образом, можно записать for (<a list of stuff>) { ... } – moritz 08.10.2008, 02:24
  • 3
    @ephemient: почти. Тот единственные работы с lexicals: для моего QW $x (b c) {...} Например: за $ _ QW (b c) {печать} # ничего не печатает – dland 08.10.2008, 21:43
  • 4
    почему добавляют, что дополнительный лексический, когда можно наслаждаться perl' s любимое значение по умолчанию? для (qw/a b c d/) {печать;} – fengshaun 09.06.2010, 20:08
  • 5
    @ephemient, @fengshaun, @moritz, @dland: That’s “fixed” в выход за край ; см. этот поток p5p . – tchrist 12.11.2010, 03:21
  • 6
    " возвратите [UICollectionReusableView, новый]; " результаты в том же исключении, к сожалению. Существует ли различный способ возвратить пустое представление? – Gifreakius 28.05.2014, 03:29

Это - метаответ, но Подсказки по Perl архивы содержат все виды интересных приемов, которые могут быть сделаны с Perl. Архив предыдущих подсказок онлайн для просмотра и может быть подписан на с помощью списка рассылки или Atom-ленты.

Некоторые мои любимые подсказки включают исполняемые файлы здания с ПАРИТЕТОМ , , использование автоумирает для выдавания исключения автоматически , и использование переключатель и умное соответствие конструкции в Perl 5.10.

Раскрытие: я - один из авторов и специалистов по обслуживанию Подсказок по Perl, таким образом, я, очевидно, думаю очень высоко о них.;)

18
ответ дан 21.09.2019, 14:29
  • 1
    It' s, вероятно, один из лучших зарегистрированных языков там и набор шаблон для инструментов для поиска документации. То, что список в этом вопросе, вероятно, не по мере необходимости что касается других языков. – Axeman 03.10.2008, 11:40
  • 2
    автоумрите очень хорошие взгляды. – j_random_hacker 16.02.2010, 20:33
  • 3
    UIView *eView = [выделение UIView] initWithFrame:CGRectMake (0,0,0,0)]; – Robert Smith 28.05.2014, 03:33

"Для" оператора может использоваться, тот же путь "с" используется в Паскале:

for ($item)
{
    s/&‎nbsp;/ /g;
    s/<.*?>/ /g;
    

"Для" оператора может использоваться, тот же путь "с" используется в Паскале:

[110]

можно применить последовательность s///операции, и т.д. к той же переменной, не имея необходимость повторять имя переменной.

ПРИМЕЧАНИЕ: неразрывное пространство выше (& ‎nbsp;) скрыл Unicode в нем для хитрости Скидки с цены. Не копируйте вставляют его:)

= join(" ", split(" ",

"Для" оператора может использоваться, тот же путь "с" используется в Паскале:

[110]

можно применить последовательность s///операции, и т.д. к той же переменной, не имея необходимость повторять имя переменной.

ПРИМЕЧАНИЕ: неразрывное пространство выше (& ‎nbsp;) скрыл Unicode в нем для хитрости Скидки с цены. Не копируйте вставляют его:)

)); }

можно применить последовательность s///операции, и т.д. к той же переменной, не имея необходимость повторять имя переменной.

ПРИМЕЧАНИЕ: неразрывное пространство выше (& ‎nbsp;) скрыл Unicode в нем для хитрости Скидки с цены. Не копируйте вставляют его:)

27
ответ дан 21.09.2019, 14:29
  • 1
    Необходимо будет сделать его свойством для использования его в представлении набора делегат/источник данных – Robert Smith 28.05.2014, 03:35

Просто заключить в кавычки почти любой вид странной строки в Perl.

my $url = q{http://my.url.com/any/arbitrary/path/in/the/url.html};

На самом деле, различные механизмы заключения в кавычки в Perl довольно интересны. Perl подобные regex механизмы заключения в кавычки позволяет Вам заключать что-либо в кавычки, определяя разделители. Можно использовать почти любой специальный символ как #,/, или открыться/закрыть символы как (), [], или {}. Примеры:

my $var  = q#some string where the pound is the final escape.#;
my $var2 = q{A more pleasant way of escaping.};
my $var3 = q(Others prefer parens as the quote mechanism.);

механизмы Заключения в кавычки:

q: литеральная кавычка; только символ, которого нужно оставить, является конечным символом. qq: интерпретируемая кавычка; переменные процессов и символы ESC. Большой для строк, что необходимо заключить в кавычки:

my $var4 = qq{This "$mechanism" is broken.  Please inform "$user" at "$email" about it.};

qx: Работы как qq, но тогда выполняет его как системную команду, не в интерактивном режиме. Возвраты весь текст, сгенерированный из стандарта. (Перенаправление, если поддерживается в ОС, также выходит), Также сделанный с одинарными левыми кавычками ('символ).

my $output  = qx{type "$path"};      # get just the output
my $moreout = qx{type "$path" 2>&1}; # get stuff on stderr too

четверть: Интерпретирует как qq, но тогда компилирует его как регулярное выражение. Работы с различными вариантами на regex также. Можно теперь раздать regex как переменную:

sub MyRegexCheck {
    my ($string, $regex) = @_;
    if ($string)
    {
       return ($string =~ $regex);
    }
    return; # returns 'null' or 'empty' in every context
}

my $regex = qr{http://[\w]\.com/([\w]+/)+};
@results = MyRegexCheck(q{http://myurl.com/subpath1/subpath2/}, $regex);

QW: очень, очень полезный оператор кавычки. Поворачивается заключенный в кавычки набор пробела разделил слова на список. Большой для того, чтобы заполнить данные в модульном тесте.


   my @allowed = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z { });
   my @badwords = qw(WORD1 word2 word3 word4);
   my @numbers = qw(one two three four 5 six seven); # works with numbers too
   my @list = ('string with space', qw(eight nine), "a $var"); # works in other lists
   my $arrayref = [ qw(and it works in arrays too) ]; 

Они являются великими использовать их каждый раз, когда это делает вещи более ясными. Для qx, qq, и q, я, скорее всего, использую {} операторы. Наиболее распространенная привычка к людям, использующим QW, обычно () оператор, но иногда Вы также видите QW//.

31
ответ дан 21.09.2019, 14:29
  • 1
    Я иногда использую qw" " так, чтобы маркеры синтаксиса выделили его правильно. – Brad Gilbert 03.10.2008, 12:47
  • 2
    Работы для меня в SlickEdit.:) – Robert P 15.01.2009, 12:35
  • 3
    @Brad: Используйте лучшего редактора! Работы для меня на энергии. – fengshaun 09.06.2010, 20:12
  • 4
    @fengshaun, редакторы, которых я обычно использую , делают выделение они правильно. Я относился, частично к маркеру синтаксиса на StackOverflow. – Brad Gilbert 14.06.2010, 12:40
  • 5
    @Brad Gilbert: Переполнение стека can’t (хорошо, (doesn’t) анализируют ценность Perl diddly приседание. ⠘№ – tchrist 12.11.2010, 03:15
  • 6
    Инстанцирование представления таким образом как локальная переменная в ' viewForSupplementaryElementOfKind' результаты в том же исключении. Добавление свойства и присвоение его также выдают исключение (инстанцированный ли в рамках метода или в viewDidLoad). – Gifreakius 28.05.2014, 03:45

Autovivification. AFAIK никакой другой язык имеет его .

35
ответ дан 21.09.2019, 14:29
  • 1
    Я понятия не имел что Python, и др., didn' t поддерживают это. – skiphoppy 04.10.2008, 06:17
  • 2
    ECMAscript autovivs. – davidnicol 04.10.2008, 11:01
  • 3
    И существует модуль для отключения autovivication – Alexandr Ciornii 30.06.2009, 00:06
  • 4
    @Gregg Lind - Учитывая, что Python автоматически создает переменные каждый раз, когда Вы сначала присваиваете им, autovivification создал бы чудовищные проблемы из единственной опечатки. – Chris Lutz 24.08.2009, 12:04
  • 5
    @tchrist - = [[x*y для y в xrange (1,11)] для x в xrange (1,11)] – Omnifarious 12.11.2010, 03:25

Операторы ++ и унарный - не только работают над числами, но также и над строками.

my 

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

= 'z' print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

aa

печать b

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

= 'z' print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

aa

= "a" print -

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

= 'z' print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

aa

печать b

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

= 'z' print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

aa

печать печать-a

print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

= 'z' print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

aa

печать b

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

= 'z' print ++

Операторы ++ и унарный - не только работают над числами, но также и над строками.

[110]

печать печать-a

[111]

печать b

[112]

aa

aa

39
ответ дан 21.09.2019, 14:29

Одна из моих любимых функций в Perl использует булевскую переменную || оператор для выбора между рядом выбора.

 $x = $a || $b;

 # $x = $a, if $a is true.
 # $x = $b, otherwise

Это означает, что можно записать:

 $x = $a || $b || $c || 0;

для принятия первого истинного значения от $a, $b, и $c, или значение по умолчанию 0 иначе.

В Perl 5.10, существует также // оператор, который возвращает левую сторону, если это определяется, и правая сторона иначе. Следующее выбирает первое , определил значение от [1 110], $b, $c, или 0 иначе:

$x = $a // $b // $c // 0;

Они могут также использоваться с их формами стенографии, которые очень полезны для обеспечения значений по умолчанию:

$x ||= 0;   # If $x was false, it now has a value of 0.

$x //= 0;   # If $x was undefined, it now has a value of zero.

За ваше здоровье,

Paul

40
ответ дан 21.09.2019, 14:29
  • 1
    Это - такая общая идиома, которую это едва квалифицирует как " hidden" функция. – Michael Carman 03.10.2008, 03:28
  • 2
    позор симпатичный принтер думает//, является комментарием:) – John Ferguson 03.10.2008, 04:31
  • 3
    Вопрос, там " используйте feature" для использования этих новых операторов, или действительно ли они - включенное значение по умолчанию? Я все еще склоняюсь Perl 5.10' s функции. – J.J. 03.10.2008, 05:34
  • 4
    //там по умолчанию, никакие специальные необходимые тонкие настройки. Можно также бэкпортировать его в 5.8.x с патчем жука-навозника... см. authors/id/H/HM/HMBRAND/каталог на любом зеркале CPAN. FreeBSD 6.x и вне делает это для Вас в их пакете жемчуга. – dland 03.10.2008, 06:46
  • 5
    Когда || или//объединен с, делают {}, можно инкапсулировать более сложное присвоение, т.е. $x =, $a || делают {мой $z; 3 или 4 строки деривации; $z}; – RET 03.10.2008, 15:40

Добавьте поддержку сжатых файлов через волшебный ARGV:

s{ 
    ^            # make sure to get whole filename
    ( 
      [^'] +     # at least one non-quote
      \.         # extension dot
      (?:        # now either suffix
          gz
        | Z 
       )
    )
    \z           # through the end
}{gzcat '$1' |}xs for @ARGV;

(кавычки вокруг $ _ необходимый для обработки имен файлов с метасимволами оболочки в)

Теперь <> функция распакует любой @ARGV файлы, которые заканчиваются ".gz" или ".Z":

while (<>) {
    print;
}
46
ответ дан 21.09.2019, 14:29
  • 1
    Это прохладно на многих разных уровнях... – Leonardo Herrera 22.11.2008, 17:51
  • 2
    Я don' t думают, что необходимо выйти | в замене. – Chris Lutz 24.08.2009, 11:56
  • 3
    I' m уставившийся на это и меня can' t выясняют, как это работает. В каком точка zcat | проанализирована как команда для передачи по каналу через? – Ether 03.06.2010, 17:44
  • 4
    @Ether = > обнаружение каналов является функцией двух открытых аргументов, который использует ромбовидный оператор, поскольку это открывает каждый файл в @ARGV – Eric Strom 05.06.2010, 20:29

Поскольку Perl имеет почти все "тайные" части из других списков, я скажу Вам одну вещь, что Perl не может:

<забастовка> одна вещь, которую не может сделать Perl, имеют пустые произвольные URL в Вашем коде, потому что // оператор используется для регулярных выражений.

На всякий случай для Вас не было очевидно, какие предложения функций Perl, вот выборочный список, возможно, не полностью очевидных записей:

Устройство Вареного пудинга - в мобильности Perl

и Стандартности - Там вероятно больше компьютеров с Perl, чем с компилятором C

класс - управления файлом/путем А работы File::Find над еще большим количеством операционных систем, чем.Net делает

, Кавычки для пробела разграничили списки и строки - , Perl позволяет Вам выбирать почти произвольные кавычки для своего списка и строковых разделителей

пространства имен Aliasable - Perl имеет их через присвоения шарика:

*My::Namespace:: = \%Your::Namespace

Статические инициализаторы - Perl может выполнить код почти в каждой фазе компиляции и возразить инстанцированию, от BEGIN (синтаксический анализ кода) к CHECK (после того, как синтаксический анализ кода) к import (в импорте модуля) к new (объектное инстанцирование) к [1 110] (объектное разрушение) к [1 111] (выход программы)

, Функции являются гражданами Первого класса - точно так же, как в области действия блока Perl

и закрытии - Perl имеет и

Вызывающие методы и средства доступа косвенно через переменную - Perl делает это также:

my $method = 'foo';
my $obj = My::Class->new();
$obj->$method( 'baz' ); # calls $obj->foo( 'baz' )

методы Определения через код - Perl признает что также :

*foo = sub { print "Hello world" };

Распространяющаяся онлайн-документация - документация Perl онлайн и вероятна в Вашей системе также

Волшебные методы , который называют каждый раз, когда Вы вызываете "несуществующую" функцию - реализации Perl, что в функции АВТОЗАГРУЗКИ

Символьные ссылки - Вам целесообразно избегать их. Они съедят Ваши дочерние элементы. , Но конечно, Perl позволяет Вам предлагать своих детей кровожадным демонам.

Одно значение строки, подкачивающее - Perl позволяет присвоение списка

Способность заменить даже базовые функции Вашей собственной функциональностью

use subs 'unlink'; 
sub unlink { print 'No.' }

или

BEGIN{
    *CORE::GLOBAL::unlink = sub {print 'no'}
};

unlink(

Поскольку Perl имеет почти все "тайные" части из других списков, я скажу Вам одну вещь, что Perl не может:

<забастовка> одна вещь, которую не может сделать Perl, имеют пустые произвольные URL в Вашем коде, потому что // оператор используется для регулярных выражений.

На всякий случай для Вас не было очевидно, какие предложения функций Perl, вот выборочный список, возможно, не полностью очевидных записей:

Устройство Вареного пудинга - в мобильности Perl

и Стандартности - Там вероятно больше компьютеров с Perl, чем с компилятором C

класс - управления файлом/путем А работы File::Find над еще большим количеством операционных систем, чем.Net делает

, Кавычки для пробела разграничили списки и строки - , Perl позволяет Вам выбирать почти произвольные кавычки для своего списка и строковых разделителей

пространства имен Aliasable - Perl имеет их через присвоения шарика:

[110]

Статические инициализаторы - Perl может выполнить код почти в каждой фазе компиляции и возразить инстанцированию, от BEGIN (синтаксический анализ кода) к CHECK (после того, как синтаксический анализ кода) к import (в импорте модуля) к new (объектное инстанцирование) к [1 110] (объектное разрушение) к [1 111] (выход программы)

, Функции являются гражданами Первого класса - точно так же, как в области действия блока Perl

и закрытии - Perl имеет и

Вызывающие методы и средства доступа косвенно через переменную - Perl делает это также:

[111]

методы Определения через код - Perl признает что также :

[112]

Распространяющаяся онлайн-документация - документация Perl онлайн и вероятна в Вашей системе также

Волшебные методы , который называют каждый раз, когда Вы вызываете "несуществующую" функцию - реализации Perl, что в функции АВТОЗАГРУЗКИ

Символьные ссылки - Вам целесообразно избегать их. Они съедят Ваши дочерние элементы. , Но конечно, Perl позволяет Вам предлагать своих детей кровожадным демонам.

Одно значение строки, подкачивающее - Perl позволяет присвоение списка

Способность заменить даже базовые функции Вашей собственной функциональностью

[113]

или

[114]) for @ARGV
36
ответ дан 21.09.2019, 14:29

В Perl существует много неочевидных функций.

, Например, Вы знали, что может быть пространство после символа?

 $ perl -wle 'my $x = 3; print $ x'
 3

Или что можно дать числовые имена нижних индексов при использовании символьных ссылок?

$ perl -lwe '*4 = sub { print "yes" }; 4->()' 
yes

существует также "bool" квази оператор, тот возврат 1 для истинных выражений и пустой строки для лжи:

$ perl -wle 'print !!4'
1
$ perl -wle 'print !!"0 but true"'
1
$ perl -wle 'print !!0'
(empty line)

Другой интересный материал: с use overload можно перегрузить строковые литералы и числа (и например сделать их BigInts или безотносительно).

Многие из этих вещей на самом деле документируются где-нибудь или следуют логически от зарегистрированных функций, но тем не менее некоторые не очень хорошо известны.

Обновление : Другой хороший. Ниже q{...} конструкции заключения в кавычки были упомянуты, но Вы знали, что можно использовать буквы в качестве разделителей?

$ perl -Mstrict  -wle 'print q bJet another perl hacker.b'
Jet another perl hacker.

Аналогично можно записать регулярные выражения:

m xabcx
# same as m/abc/
47
ответ дан 21.09.2019, 14:29
  • 1
    “Did Вы знаете, что может быть пространство после символа? ” я крайне изумлен. Ничего себе. – Aristotle Pagaltzis 03.10.2008, 09:00
  • 2
    Охладитесь!!! $undef_var doesn' t создают предупреждение. – Axeman 03.10.2008, 10:40
  • 3
    Я думаю, что Вашим примером использования букв для разграничивания строк должен быть " Всего другой жемчуг hacker" вместо " Струя другой жемчуг hacker" =P – Chris Lutz 24.08.2009, 11:58
  • 4
    Худшая часть - то, что можно использовать другие вещи в качестве разделителей, также. Даже закрывающие скобки. Следующее допустимо: s} regex} замена} xsmg; q] строковый литерал]; – Ryan Thompson 28.10.2009, 10:03
  • 5
    LOL 4->()... – j_random_hacker 16.02.2010, 19:58

карта - не только потому, что это делает код более выразительным, но потому что это дало мне импульс читать немного больше об этом "функциональном программировании".

18
ответ дан 21.09.2019, 14:29

Продолжать пункт на циклах. Это будет выполняться у основания каждого цикла, даже те, которые являются next'ed.

while( <> ){
  print "top of loop\n";
  chomp;

  next if /next/i;
  last if /last/i;

  print "bottom of loop\n";
}continue{
  print "continue\n";
}
15
ответ дан 21.09.2019, 14:29

Мой голос пошел бы для (? {}) и (?? {}) группы в регулярных выражениях Perl. Первое выполняет код Perl, игнорируя возвращаемое значение, второе выполняет код, с помощью возвращаемого значения в качестве регулярного выражения.

15
ответ дан 21.09.2019, 14:29
  • 1
    жемчуг изобрел столько regexp расширений, что другие программы теперь часто используют pcre (жемчуг совместимый regex) вместо исходного regex языка. – Sec 03.10.2008, 02:36
  • 2
    Считайте небольшую аннотацию здесь perldoc.perl.org/… :-D – J.J. 03.10.2008, 05:30
  • 3
    Perl действительно имеет (насколько я знаю), опередите других, когда дело доходит до regexps. – Brad Gilbert 03.10.2008, 11:53
  • 4
    Это, до I' m знающий, все еще экспериментально, и может не работать тот же путь в будущем Perls. Не сказать что это isn' t полезный, но немного более безопасное и так же, как применимая версия может быть найдена в s///command' s/e флаг: s/(pattern)/reverse($1);/ge; # инвертирует весь patterns. – Chris Lutz 10.02.2009, 11:22
  • 5
    @Chris Лутц, @Leon Timmerman: Обратите внимание, что те две конструкции теперь reë ntrant. Также обратите внимание, что второй больше не должен использоваться для осуществления рекурсивных шаблонов, теперь, когда мы можем рекурсивно вызвать группы получения. @Brad Gilbert: право That’s, хотя PCRE делает достойное задание отслеживания нас; одной областью regex превосходства, где Perl является абсолютно бесспорным, является свой доступ к свойствам Unicode; посмотрите мое unitrio распределение uninames, unichars, и особенно uniprops для наблюдения просто части того, что я имею в виду. – tchrist 12.11.2010, 03:33

свяжите, переменный интерфейс связи.

9
ответ дан 21.09.2019, 14:29
  • 1
    Связь:: Файл сохранил мой день однажды! – mhd 03.03.2009, 23:58

"Режим отчаяния" цикла Perl управляет конструкциями, который заставляет их искать стек, чтобы найти, что маркировка соответствия позволяет некоторые любопытные поведения который Тест:: Больше использует в своих интересах, что бы там ни было.

SKIP: {
    skip() if $something;

    print "Never printed";
}

sub skip {
    no warnings "exiting";
    last SKIP;
}

существует мало известный .pmc файл. "используйте Foo", будет искать Foo.pmc в @INC перед Foo.pm. Это было предназначено, чтобы позволить скомпилированному байт-коду быть загруженным сначала, но Модуль:: Скомпилируйте , использует в своих интересах, это к источнику кэша фильтровало модули в течение более быстрого времени загрузки и более легкой отладки.

способность превратить предупреждения в ошибки.

local $SIG{__WARN__} = sub { die @_ };
$num = "two";
$sum = 1 + $num;
print "Never reached";

Это - то, о чем я могу думать первое, что пришло на ум, который не был упомянут.

9
ответ дан 21.09.2019, 14:29

Специальные блоки кода такой как BEGIN, CHECK и END. Они прибывают из Awk, но работают по-другому в Perl, потому что это не основано на записи.

BEGIN блок может использоваться для определения некоторого кода для фазы парсинга; это также выполняется, когда Вы делаете syntax-and-variable-check perl -c. Например, для загрузки в переменных конфигурации:

BEGIN {
    eval {
        require 'config.local.pl';
    };
    if ($@) {
        require 'config.default.pl';
    }
}
11
ответ дан 21.09.2019, 14:29
rename("[110] 

переименовывает data.txt.part к data.txt, не имея необходимость повторять меня.

.part", [110]

переименовывает data.txt.part к data.txt, не имея необходимость повторять меня.

) for "data.txt";

переименовывает data.txt.part к data.txt, не имея необходимость повторять меня.

11
ответ дан 21.09.2019, 14:29

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

print ~~ localtime;

совпадает с

print scalar localtime;

и отличающийся от

print localtime;
10
ответ дан 21.09.2019, 14:29
  • 1
    Это особенно неясно, потому что perl5.10.0 также представляет " умное соответствие operator" ~~, то, которое может сделать соответствия regex, может посмотреть, если объект содержится в массиве и так далее. – moritz 03.10.2008, 02:52
  • 2
    That' s не неясный, that' s запутываемый (и полезный для гольфа и JAPHs). – Michael Carman 03.10.2008, 03:18
  • 3
    Это не корректно! ~~ не безопасен на ссылках! Это stringifies их. – Leon Timmermans 03.10.2008, 05:04
  • 4
    Да, конечно. Stringification - то, что происходит со ссылками, когда вызвано в скалярный контекст. Как делает, которые делают " ~~ вызывает скаляр context" неправильный? – Dave Sherohman 03.10.2008, 06:00
  • 5
    Дервиш @Nomad: Скалярный контекст / = stringification., например, " $n = @a" скалярный контекст. " $s = qq' @a' " stringification. Относительно ссылок, " $ref1 = $ref2" скалярный контекст, но не делает stringify. – Michael Carman 03.10.2008, 07:09
while(/\G(\b\w*\b)/g) {
     print "$1\n";
}

\G привязка. жарко .

13
ответ дан 21.09.2019, 14:29
  • 1
    ... и это указывает на положение конца предыдущего соответствия. – Dave Sherohman 03.10.2008, 06:05
  • 2
    Но необходимо назвать regex в скалярном контексте. – davidnicol 04.10.2008, 11:03
  • 3
    @davidnicol: вышеупомянутые работы кода. Можно ли разъяснить то, что Вы имеете в виду? – J.J. 04.10.2008, 23:27

Пустой оператор <> ромба дескриптора файла имеет свое место в создании инструментов командной строки. Это действует как <FH> для чтения из дескриптора, за исключением того, что это волшебно выбирает, какой бы ни найден первым: имена файлов командной строки или STDIN. Взятый от perlop:

while (<>) {
...         # code for each line
}
12
ответ дан 21.09.2019, 14:29
  • 1
    Это также следует за семантикой UNIX использования "-" означать " читайте из stdin. Таким образом, Вы могли сделать perl myscript.pl file1.txt - file2.txt, и жемчуг обработает первый файл, тогда stdin, тогда второй файл. – Ryan Thompson 28.10.2009, 10:28
  • 2
    Вы можете overload <> оператор на Ваших собственных объектах (<$var>) для работы как итератор. Однако это не работает, как Вы могли ожидать в контексте списка. – dolmen 30.03.2011, 02:50

m// оператор имеет некоторые неясные особые случаи:

  • , Если Вы используете ? в качестве разделителя, он только соответствует однажды, если Вы не звоните reset.
  • , Если Вы используете ' в качестве разделителя, шаблон не интерполирован.
  • , Если шаблон пуст, он использует шаблон от последнего успешного соответствия.
13
ответ дан 21.09.2019, 14:29
  • 1
    Это больше как скрытые глюки, чем скрытые функции! Я don' t знают любого, кому нравятся они. Поток на p5p, некоторое время назад обсудило полноценность предполагаемого m/флага $foo/r, где/r не будет означать интерполяции (буква isn' t важный), так как никто никогда не может помнить вещь одинарных кавычек. – dland 03.10.2008, 06:43
  • 2
    @dland:Идет; I' d называют эти скрытые mis функции и никогда не использовали бы их в производственном коде. – Michael Carman 03.10.2008, 06:59
  • 3
    Я can' t воображают неспособность программиста Perl помнить (или даже предположить), что одинарные кавычки не обозначают интерполяцию. Его использование с этой семантикой почти универсально на языке это I' d скорее ожидают это быть так... – sundar 04.10.2008, 07:53
  • 4
    и если шаблон будет пуст, и последнее успешное соответствие было скомпилировано с/o модификатором, с тех пор это застрянет на том шаблоне. – davidnicol 04.10.2008, 11:11
  • 5
    Я думаю, что пустое поведение шаблона было удержано от использования. Прежде всего, потому что шаблон как m/$foo/становится противной ошибкой, когда $foo пуст. – Matthew S 18.05.2010, 19:12

Лесоруб напомнил мне о том, как легкий это должно обернуть некоторые встроенные функции.

, Прежде чем Perl 5.10 Perl не имел структурной распечатки программы (говорят) как Python.

Так в Вашей локальной программе Вы могли сделать что-то как:

sub print {
     print @_, "\n";
}

или добавляют в некоторой отладке.

sub print {
    exists $ENV{DEVELOPER} ?
    print Dumper(@_) :
    print @_;
}
2
ответ дан 21.09.2019, 14:29
  • 1
    It' s также очень легкий случайно изменить контекст! Ваша подпрограмма печати (использование. конкатенировать), распечатает количество объектов, которые будут распечатаны, а не сами объекты. Используя print @_, "\n" (отмечают запятую) сохранит контекст. – pjf 03.10.2008, 12:22
  • 2
    :-D, спасибо за разъяснение. Я отредактирую соответственно.:-D учат меня писать код, не выполняя его:-P – J.J. 03.10.2008, 15:55
  • 3
    Er... кроме меня don' t думают, что можно переопределить, печатают этот путь. Большая часть другого builtins я думаю, что Вы можете, но не печать.: | – Robert P 04.04.2009, 12:57
  • 4
    Это верно - print, не может быть переопределен. – Chris Lutz 25.08.2009, 14:16
  • 5
    @Chris: It' s истинная печать не может быть переопределен этим способом. Но не, что это не может быть переопределено абсолютно. Используя некоторые sub модули B и некоторых приемов можно найти на perlmonks.com , можно переопределить его. – J.J. 10.09.2009, 07:23

Теги

Похожие вопросы