Вы почти наверняка захотите добавить use Smart::Comments
к модулям, которые содержат такие, а затем переключить переключатель в вашей среде , установив $Smart_Comments
соответствующим образом.
Погоня, import
угон обезьян - это безумие.
Но, может быть, вам нравятся такие вещи. Скажем, у вас есть Foo.pm
:
package Foo;
use Exporter 'import';
our @EXPORT = qw/ foo /;
#use Smart::Comments;
sub foo {
my @result;
for (my $i = 0; $i < 5; $i++) {
### $i
push @result => $i if $i % 2 == 0;
}
wantarray ? @result : \@result;
}
1;
Обычное использование:
$ perl -MFoo -e 'print foo, "\n"'
024
Обычный, конечно, скучный и скучный. С run-foo
мы делаем смелые, стремительные шаги!
#! /usr/bin/perl
use warnings;
use strict;
BEGIN {
unshift @INC => \&inject_smart_comments;
my %direct;
open my $fh, "<", $0 or die "$0: open: $!";
while (<$fh>) {
++$direct{$1} if /^\s*use\s+([A-Z][:\w]*)/;
}
close $fh;
sub inject_smart_comments {
my(undef,$path) = @_;
s/[\/\\]/::/g, s/\.pm$// for my $mod = $path;
if ($direct{$mod}) {
open my $fh, "<", $path or die "$0: open $path: $!";
return sub {
return 0 unless defined($_ = <$fh>);
s{^(\s*package\s+[A-Z][:\w]*\s*;\s*)$}
{$1 use Smart::Comments;\n};
return 1;
};
}
}
}
use Foo;
print foo, "\n";
(Прошу прощения за компактность: я сжал ее, чтобы она поместилась в блоке без прокрутки.)
Выход:
$ ./run-foo
### $i: 0
### $i: 1
### $i: 2
### $i: 3
### $i: 4
024
& iexcl;! Viva
С помощью @INC
крючков мы можем заменить наши собственные или измененные источники. Код следит за попытками require
модулей, непосредственно используемых программой. При попадании inject_smart_comments
возвращает итератор, который возвращает по одной строке за раз. Когда этот хитрый, хитрый итератор видит объявление пакета, он добавляет к чанку невинно выглядящий use Smart::Comments
, создавая впечатление, что он все время находился в источнике модуля.
При попытке проанализировать код Perl с помощью регулярных выражений код будет нарушен, если, например, объявление пакета не находится в отдельной строке. Сезон по вкусу.