Вы вставляете, не обновляя результат. Вы можете определить столбец имен в основном столбце или установить его уникальным.
Возможность использовать хэш в качестве видимого фильтра в цикле. Мне еще предстоит увидеть что-нибудь столь же красивое на другом языке. Например, мне не удалось продублировать это в python.
Например, я хочу напечатать строку, если ее раньше не видели.
my %seen;
for (<LINE>) {
print $_ unless $seen{$_}++;
}
Новая опция -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
Вы можете использовать различные кавычки на 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";
@Schwern упомянул о превращении предупреждений в ошибки путем локализации $ SIG {__ WARN __}
. Вы также можете сделать это (лексически) с помощью use warnings FATAL => "all";
. См. perldoc lexwarn
.
В связи с этим, начиная с Perl 5.12, вы можете сказать perldoc foo
вместо полного perldoc perlfoo
. Ну наконец то! :)
$ 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 __"
идиома.
Выражение определенное & DB :: DB
возвращает истину, если программа выполняется из отладчика.
Интерполяция регулярных выражений совпадений. Полезное применение этого - при сопоставлении в черном списке. Без использования интерполяции это записывается так:
#detecting blacklist words in the current line
/foo|bar|baz/;
Вместо этого может быть записано
@blacklistWords = ("foo", "bar", "baz");
$anyOfBlacklist = join "|", (@blacklistWords);
/$anyOfBlacklist/;
Это более подробный вариант, но позволяет производить заполнение из файла данных. Кроме того, если список сохраняется в источнике по какой-либо причине, легче поддерживать массив, чем RegExp.
Использование хэшей (где ключи уникальны) для получения уникальных элементов списка:
my %unique = map { $_ => 1 } @list;
my @unique = keys %unique;
Использование голых блоков с Redo
или другие элементы управления для создания пользовательских контурных конструкций.
Проверьте связанный список объектов, возвращающих первый -> Можно («Print»)
Метод:
sub get_printer {
my $self = shift;
{$self->can('print') or $self = $self->next and redo}
}
Добавьте одну для функций unpack() и pack(), которые отлично подходят, если вам нужно импортировать и/или экспортировать данные в формате, который используется другими программами.
Конечно, в наши дни большинство программ позволяют экспортировать данные в XML, и многие распространенные проприетарные форматы документов имеют связанные с ними Perl-модули, написанные для них. Но это одна из тех возможностей, которая невероятно полезна, когда она вам нужна, и pack()/unpack(), вероятно, является причиной того, что люди смогли написать CPAN-модули для такого количества несвободных форматов данных.
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
Вы можете развернуть вызовы функций в строку, например:
print my $foo = "foo @{[scalar(localtime)]} bar";
foo Ср, 26 мая, 15:50:30 2010 bar
В следующий раз, когда вы будете на вечеринке компьютерных фанатов, вытащите эту строчку в оболочке bash, и женщины будут окружать вас, и ваши друзья будут поклоняться вам:
find. -name "* .txt" | xargs perl -pi -e 's / 1: (\ S +) / uc ($ 1) / ge'
Обрабатывать все файлы * .txt и выполнять поиск и замену на месте, используя регулярное выражение perl. Он преобразует текст после «1:» в верхний регистр и удаляет «1:». Использует модификатор Perl 'e' для обработки второй части регулярного выражения поиска / замены как исполняемого кода. Мгновенная однострочная система шаблонов. Использование xargs позволяет обрабатывать огромное количество файлов без ограничения длины командной строки bash.