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

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

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

73 ответа

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

Например, я хочу напечатать строку, если ее раньше не видели.

my %seen;

for (<LINE>) {
  print $_ unless $seen{$_}++;
}
2
ответ дан 23 November 2019 в 22:56
поделиться

Новая опция -E в командной строке:

> perl -e "say 'hello"" # does not work 

String found where operator expected at -e line 1, near "say 'hello'"
        (Do you need to predeclare say?)
syntax error at -e line 1, near "say 'hello'"
Execution of -e aborted due to compilation errors.

> perl -E "say 'hello'" 
hello
2
ответ дан 23 November 2019 в 22:56
поделиться

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

my $interpolation = "We will interpolated variables";
print <<"END";
With double quotes, $interpolation, just like normal HEREDOCS.
END

print <<'END';
With single quotes, the variable $foo will *not* be interpolated.
(You have probably seen this in other languages.)
END

## this is the fun and "hidden" one
my $shell_output = <<`END`;
echo With backticks, these commands will be executed in shell.
echo The output is returned.
ls | wc -l
END

print "shell output: $shell_output\n";
3
ответ дан 23 November 2019 в 22:56
поделиться

@Schwern упомянул о превращении предупреждений в ошибки путем локализации $ SIG {__ WARN __} . Вы также можете сделать это (лексически) с помощью use warnings FATAL => "all"; . См. perldoc lexwarn .

В связи с этим, начиная с Perl 5.12, вы можете сказать perldoc foo вместо полного perldoc perlfoo . Ну наконец то! :)

5
ответ дан 23 November 2019 в 22:56
поделиться

$ 0 - это имя выполняемого скрипта perl. Его можно использовать для получения контекста, из которого запускается модуль.

# MyUsefulRoutines.pl

sub doSomethingUseful {
  my @args = @_;
  # ...
}

if ($0 =~ /MyUsefulRoutines.pl/) {
  # someone is running  perl MyUsefulRoutines.pl [args]  from the command line
  &doSomethingUseful (@ARGV);
} else {
  # someone is calling  require "MyUsefulRoutines.pl"  from another script
  1;
}

Эта идиома полезна для обработки автономного сценария с некоторыми полезными подпрограммами в библиотеке, которая может быть импортирована в другие сценарии. Python имеет аналогичные функции с объектом .__ name__ == "__main __" идиома.

0
ответ дан 23 November 2019 в 22:56
поделиться

Выражение определенное & DB :: DB возвращает истину, если программа выполняется из отладчика.

1
ответ дан 23 November 2019 в 22:56
поделиться

Интерполяция регулярных выражений совпадений. Полезное применение этого - при сопоставлении в черном списке. Без использования интерполяции это записывается так:

#detecting blacklist words in the current line
/foo|bar|baz/;

Вместо этого может быть записано

@blacklistWords = ("foo", "bar", "baz");
$anyOfBlacklist = join "|", (@blacklistWords);
/$anyOfBlacklist/;

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

1
ответ дан 23 November 2019 в 22:56
поделиться

Использование хэшей (где ключи уникальны) для получения уникальных элементов списка:

my %unique = map { $_ => 1 } @list;
my @unique = keys %unique;
1
ответ дан 23 November 2019 в 22:56
поделиться

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

Проверьте связанный список объектов, возвращающих первый -> Можно («Print») Метод:

sub get_printer {
    my $self = shift;
    {$self->can('print') or $self = $self->next and redo}
}
0
ответ дан 23 November 2019 в 22:56
поделиться

Добавьте одну для функций unpack() и pack(), которые отлично подходят, если вам нужно импортировать и/или экспортировать данные в формате, который используется другими программами.

Конечно, в наши дни большинство программ позволяют экспортировать данные в XML, и многие распространенные проприетарные форматы документов имеют связанные с ними Perl-модули, написанные для них. Но это одна из тех возможностей, которая невероятно полезна, когда она вам нужна, и pack()/unpack(), вероятно, является причиной того, что люди смогли написать CPAN-модули для такого количества несвободных форматов данных.

1
ответ дан 23 November 2019 в 22:56
поделиться

Perl отлично подходит в качестве гибкого awk/sed.

Например, можно использовать простую замену для ls | xargs stat, наивно сделанную как:

$ ls | perl -pe 'print "stat "' | sh 

Это не очень хорошо работает, когда входные данные (имена файлов) содержат пробелы или специальные символы оболочки, например |$\. Поэтому в выводе Perl часто требуются одинарные кавычки.

Одна из сложностей при вызове perl через командную строку -ne заключается в том, что оболочка получает возможность первой просмотреть ваш однострочный текст. Это часто приводит к мучительным побегам, чтобы удовлетворить его.

Одна "скрытая" функция, которую я постоянно использую, это \x27 включить одинарную кавычку вместо того, чтобы пытаться использовать экранирование оболочки '\''

Так:

$ ls | perl -nle 'chomp; print "stat '\''$_'\''"' | sh

можно более безопасно написать:

$ ls | perl -pe 's/(.*)/stat \x27$1\x27/' | sh

Это не будет работать с забавными символами в именах файлов, даже в такой кавычке. Но это будет:

$ ls | perl -pe 's/\n/\0/' | xargs -0 stat
0
ответ дан 23 November 2019 в 22:56
поделиться

Вы можете развернуть вызовы функций в строку, например:

print my $foo = "foo @{[scalar(localtime)]} bar";

foo Ср, 26 мая, 15:50:30 2010 bar

2
ответ дан 23 November 2019 в 22:56
поделиться

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

find. -name "* .txt" | xargs perl -pi -e 's / 1: (\ S +) / uc ($ 1) / ge'

Обрабатывать все файлы * .txt и выполнять поиск и замену на месте, используя регулярное выражение perl. Он преобразует текст после «1:» в верхний регистр и удаляет «1:». Использует модификатор Perl 'e' для обработки второй части регулярного выражения поиска / замены как исполняемого кода. Мгновенная однострочная система шаблонов. Использование xargs позволяет обрабатывать огромное количество файлов без ограничения длины командной строки bash.

1
ответ дан 23 November 2019 в 22:56
поделиться