例如,我的脚本包括
use Neu::Image;
我想为Neu :: Image加载Smart::Comments
,但是指定
$perl -MSmart::Comments script.pl
不为Neu :: Image加载Smart :: Comments.
此行为在Smart::Comments documentation中描述:
If you’re debugging an application you
can also invoke it with the module
from the command-line:06002
Of course,this only enables smart
comments in the application file
itself,not in any modules that the
application loads.
我已经看过的一些其他事情:
> Perl Command-Line Options
> perldoc perlrun(我搜查了一下
对于“模块”这个词)
替代方法
正如gbacon所提到的,Smart :: Comments提供了一个环境变量选项,允许打开或关闭它.但是,如果可能的话,我希望能够在不修改原始源的情况下打开它.
解决方法
藏匿,进口劫持猴子修补是疯狂的.
但也许你会遇到那种事情.假设你有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
¡万岁!
使用@INC
hooks,我们可以替换自己的或修改过的来源.该代码监视尝试要求程序直接使用的模块.在命中时,inject_smart_comments返回一个迭代器,一次产生一行.当这个狡猾的,巧妙的迭代器看到包声明时,它会向块中添加一个看起来无辜的Smart :: Comments,使它看起来好像它一直在模块的源代码中.