Скрытые функции Perl?

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

143
задан 17 revs, 7 users 53% 25 September 2017 в 20:53
поделиться

73 ответа

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

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

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

54
ответ дан John Siracusa 25 September 2017 в 20:53
поделиться

Показ прогресса сценария путем печати на той же строке:

$| = 1; # flush the buffer on the next output 

for $i(1..100) {
    print "Progress $i %\r"
}
0
ответ дан 2 revs, 2 users 94% 25 September 2017 в 20:53
поделиться

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

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

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

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

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

sub print {
    exists $ENV{DEVELOPER} ?
    print Dumper(@_) :
    print @_;
}
2
ответ дан 4 revs, 2 users 90% 25 September 2017 в 20:53
поделиться

Ядро IO::Handle модуль. Самая важная вещь для меня состоит в том, что это позволяет автосброс на дескрипторах файлов. Пример:

use IO::Handle;    
$log->autoflush(1);
4
ответ дан 2 revs, 2 users 83% 25 September 2017 в 20:53
поделиться

@Corion - Пустые URL в Perl? Конечно, Вы можете, даже в интерполированных строках. Единственное время это имело бы значение, находится в строке, которую Вы на самом деле ИСПОЛЬЗОВАЛИ как регулярное выражение.

0
ответ дан Toby 25 September 2017 в 20:53
поделиться

Как насчет способности использовать

my @symbols = map { +{ 'key' => $_ } } @things;

генерировать массив hashrefs от массива - + перед hashref снимает неоднозначность блока, таким образом, интерпретатор знает, что это - hashref и не блок кода.Потрясающе.

(Благодаря Dave Doyle для объяснения этого мне в последнем Торонто встреча Perlmongers.)

4
ответ дан talexb 25 September 2017 в 20:53
поделиться

Безопасные отсеки.

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

С наилучшими пожеланиями,

4
ответ дан melo 25 September 2017 в 20:53
поделиться

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

$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
ответ дан Sec 25 September 2017 в 20:53
поделиться

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

ls |perl -lne 'print $_; }{ print "$. Files"'

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

LINE: while (defined($_ = <ARGV>)) {
    print $_; }{ print "$. Files";
}
22
ответ дан 2 revs, 2 users 95% 25 September 2017 в 20:53
поделиться

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

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

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

print for (1, 4, 9) x 3; # print 149149149
24
ответ дан 2 revs, 2 users 77% 25 September 2017 в 20:53
поделиться

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
ответ дан dland 25 September 2017 в 20:53
поделиться

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

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

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

18
ответ дан pjf 25 September 2017 в 20:53
поделиться

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

for ($item)
{
    s/&‎nbsp;/ /g;
    s/<.*?>/ /g;
    $_ = join(" ", split(" ", $_));
}

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

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

27
ответ дан 5 revs, 3 users 88% 25 September 2017 в 20:53
поделиться

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

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

  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
ответ дан 4 revs, 2 users 95% 25 September 2017 в 20:53
поделиться

Просто заключить в кавычки почти любой вид странной строки в 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
ответ дан 3 revs, 2 users 96% 25 September 2017 в 20:53
поделиться

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

35
ответ дан J.J. 25 September 2017 в 20:53
поделиться

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

my $_ = "a"
print -$_

печать-a

print ++$_

печать b

$_ = 'z'
print ++$_

печать aa

39
ответ дан Leon Timmermans 25 September 2017 в 20:53
поделиться

Одна из моих любимых функций в 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
ответ дан 3 revs, 3 users 85% 25 September 2017 в 20:53
поделиться

Добавьте поддержку сжатых файлов через волшебный 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
ответ дан 4 revs, 3 users 50% 25 September 2017 в 20:53
поделиться

В 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
ответ дан 3 revs, 2 users 92% 25 September 2017 в 20:53
поделиться

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

18
ответ дан 2 revs, 2 users 67% 25 September 2017 в 20:53
поделиться

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

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

__DATA__
some good data
some bad data
more good data 
more good data 
26
ответ дан 2 revs, 2 users 93%allan 25 September 2017 в 20:53
поделиться

Продолжать пункт на циклах. Это будет выполняться у основания каждого цикла, даже те, которые являются 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
ответ дан Shawn H Corey 25 September 2017 в 20:53
поделиться

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

15
ответ дан 2 revs, 2 users 67% 25 September 2017 в 20:53
поделиться
sub load_file
{
    local(@ARGV, $/) = shift;
    <>;
}

и версия, которая возвращает массив как соответствующий:

sub load_file
{
    local @ARGV = shift;
    local $/ = wantarray? $/: undef;
    <>;
}
6
ответ дан 2 revs 25 September 2017 в 20:53
поделиться

Также существует $ [переменная, которая решает, в котором индексе запускается массив. Значение по умолчанию 0, таким образом, массив запускается в 0. Установкой

$[=1;

можно заставить Perl вести себя больше как AWK (или Фортран), если Вы действительно хотите.

5
ответ дан 2 revs, 2 users 71% 25 September 2017 в 20:53
поделиться

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

9
ответ дан davidnicol 25 September 2017 в 20:53
поделиться

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

my %number_for = (one => 1, two => 2, three => 3);
my %your_numbers = (two => 2, four => 4, six => 6);
@number_for{keys %your_numbers} = values %your_numbers;
print sort values %number_for; # 12346
7
ответ дан Vince Veselosky 25 September 2017 в 20:53
поделиться
rename("$_.part", $_) for "data.txt";

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

11
ответ дан timkay 25 September 2017 в 20:53
поделиться