Вы вставляете, не обновляя результат. Вы можете определить столбец имен в основном столбце или установить его уникальным.
Триггерный оператор полезен для пропуска первого повторения когда цикличное выполнение через записи (обычно строки) возвращенный дескриптором файла, не используя переменную флага:
while(<$fh>)
{
next if 1..1; # skip first record
...
}
Выполнение perldoc perlop
и поиск "триггера" для получения дополнительной информации и примеров.
Показ прогресса сценария путем печати на той же строке:
$| = 1; # flush the buffer on the next output
for $i(1..100) {
print "Progress $i %\r"
}
Лесоруб напомнил мне о том, как легкий это должно обернуть некоторые встроенные функции.
, Прежде чем Perl 5.10 Perl не имел структурной распечатки программы (говорят) как Python.
Так в Вашей локальной программе Вы могли сделать что-то как:
sub print {
print @_, "\n";
}
или добавляют в некоторой отладке.
sub print {
exists $ENV{DEVELOPER} ?
print Dumper(@_) :
print @_;
}
Ядро IO::Handle
модуль. Самая важная вещь для меня состоит в том, что это позволяет автосброс на дескрипторах файлов. Пример:
use IO::Handle;
$log->autoflush(1);
@Corion - Пустые URL в Perl? Конечно, Вы можете, даже в интерполированных строках. Единственное время это имело бы значение, находится в строке, которую Вы на самом деле ИСПОЛЬЗОВАЛИ как регулярное выражение.
Как насчет способности использовать
my @symbols = map { +{ 'key' => $_ } } @things;
генерировать массив hashrefs от массива - + перед hashref снимает неоднозначность блока, таким образом, интерпретатор знает, что это - hashref и не блок кода.Потрясающе.
(Благодаря Dave Doyle для объяснения этого мне в последнем Торонто встреча Perlmongers.)
Безопасные отсеки.
С Безопасным модулем можно создать собственную среду стиля песочницы, использующую только жемчуг. Вы тогда были бы в состоянии загрузить сценарии жемчуга в песочницу.
С наилучшими пожеланиями,
Давайте запустимся легкий с Оператор .
$a = 5 <=> 7; # $a is set to -1
$a = 7 <=> 5; # $a is set to 1
$a = 6 <=> 6; # $a is set to 0
Космического корабля На основе пути "-n"
и "-p"
переключатели реализованы в Perl 5, можно записать на вид неправильную программу включая }{
:
ls |perl -lne 'print $_; }{ print "$. Files"'
который преобразовывается внутренне в этот код:
LINE: while (defined($_ = <ARGV>)) {
print $_; }{ print "$. Files";
}
Двоичный файл "x" оператор повторения:
print '-' x 80; # print row of dashes
Это также работает со списками:
print for (1, 4, 9) x 3; # print 149149149
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.
Это - метаответ, но Подсказки по Perl архивы содержат все виды интересных приемов, которые могут быть сделаны с Perl. Архив предыдущих подсказок онлайн для просмотра и может быть подписан на с помощью списка рассылки или Atom-ленты.
Некоторые мои любимые подсказки включают исполняемые файлы здания с ПАРИТЕТОМ , , использование автоумирает для выдавания исключения автоматически , и использование переключатель и умное соответствие конструкции в Perl 5.10.
Раскрытие: я - один из авторов и специалистов по обслуживанию Подсказок по Perl, таким образом, я, очевидно, думаю очень высоко о них.;)
"Для" оператора может использоваться, тот же путь "с" используется в Паскале:
for ($item)
{
s/ / /g;
s/<.*?>/ /g;
$_ = join(" ", split(" ", $_));
}
Можно применить последовательность s///операции, и т.д. к той же переменной, не имея необходимость повторять имя переменной.
Примечание: неразрывное пространство выше (и nbsp;) скрыл Unicode в нем для хитрости Скидки с цены. Не копируйте вставляют его :)
я сказал бы способность развернуть язык, создание псевдо блочных операций является тем.
Вы объявляете прототип для 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 );
}
}
можно тогда звонить, это в теле как так
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 миллиардов.
Просто заключить в кавычки почти любой вид странной строки в 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//.
Autovivification. AFAIK никакой другой язык имеет его .
Операторы ++ и унарный - не только работают над числами, но также и над строками.
my $_ = "a"
print -$_
печать-a
print ++$_
печать b
$_ = 'z'
print ++$_
печать aa
Одна из моих любимых функций в 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
Добавьте поддержку сжатых файлов через волшебный 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;
}
В 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/
Едва ли скрытый, но многие каждый день программисты Perl не знают [приблизительно 110] CPAN. Это особенно относится к людям, которые не являются полностью занятыми программистами или не программируют в полный рабочий день Perl.
карта - не только потому, что это делает код более выразительным, но потому что это дало мне импульс читать немного больше об этом "функциональном программировании".
Способность проанализировать данные, непосредственно вставляемые в ДАННЫЕ блок. Никакая потребность сохранить в тестовый файл, который будет открыт в программе или подобный. Например:
my @lines = <DATA>;
for (@lines) {
print if /bad/;
}
__DATA__
some good data
some bad data
more good data
more good data
Продолжать пункт на циклах. Это будет выполняться у основания каждого цикла, даже те, которые являются 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";
}
Мой голос пошел бы для (? {}) и (?? {}) группы в регулярных выражениях Perl. Первое выполняет код Perl, игнорируя возвращаемое значение, второе выполняет код, с помощью возвращаемого значения в качестве регулярного выражения.
sub load_file
{
local(@ARGV, $/) = shift;
<>;
}
и версия, которая возвращает массив как соответствующий:
sub load_file
{
local @ARGV = shift;
local $/ = wantarray? $/: undef;
<>;
}
Также существует $ [переменная, которая решает, в котором индексе запускается массив. Значение по умолчанию 0, таким образом, массив запускается в 0. Установкой
$[=1;
можно заставить Perl вести себя больше как AWK (или Фортран), если Вы действительно хотите.
Я не знаю, насколько тайный это, но одно из моего избранного часть хеша . Я использую его для всех видов вещей. Например, объединить два хеша:
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
rename("$_.part", $_) for "data.txt";
переименовывает data.txt.part к data.txt, не имея необходимость повторять меня.