я сказал бы способность развернуть язык, создание псевдо блочных операций является тем.
Вы объявляете прототип для 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 миллиардов.
Прямо сейчас вы можете делать то, что делаю я, что беспорядочно, но отлично работает * (это использование предполагает, что вы используете virtualenvwrapper - - что вы должны быть - но вы можете легко заменить его в более длинном вызове 'source', который вы упомянули, если нет):
def task():
workon = 'workon myvenv && '
run(workon + 'git pull')
run(workon + 'do other stuff, etc')
Начиная с версии 1.0, Fabric имеет префикс
диспетчер контекста , который использует эту технику, чтобы вы могли, например:
def task():
with prefix('workon myvenv'):
run('git pull')
run('do other stuff, etc')
* Вероятны случаи, когда использование подхода command1 && command2
может вас подорвать, например, когда command1
терпит неудачу ( command2
никогда не запустится) или если command1
не работает »t правильно экранирован и содержит специальные символы оболочки и т. д.
Я просто использую простую функцию-оболочку virtualenv (), которую можно вызывать вместо run (). Он не использует диспетчер контекста компакт-диска, поэтому можно использовать относительные пути.
def virtualenv(command):
"""
Run a command in the virtualenv. This prefixes the command with the source
command.
Usage:
virtualenv('pip install django')
"""
source = 'source %(project_directory)s/bin/activate && ' % env
run(source + command)