gpt4 book ai didi

perl - 如何在加载的模块中使用 Smart::Comments 而不更改其源?

转载 作者:行者123 更新时间:2023-12-02 00:38:42 24 4
gpt4 key购买 nike

如何指定为我的原始脚本以及它直接加载的任何模块加载 Smart::Comments。然而,由于它是一个源过滤器,如果应用于每个其他加载模块加载的每个模块,它可能会造成严重破坏。

例如,我的脚本包括

use Neu::Image;

我想加载Smart::Comments对于 Neu::Image 也是如此,但指定

$ perl -MSmart::Comments script.pl

未加载 Neu::ImageSmart::Comments

Smart::Comments documentation 中描述了此行为:

If you're debugging an application you can also invoke it with the module from the command-line:

perl -MSmart::Comments $application.pl

Of course, this only enables smart comments in the application file itself, not in any modules that the application loads.

我已经看过的其他一些内容:

解决方法正如 gbacon 提到的,Smart::Comments 提供了一个环境变量选项,允许打开或关闭它。但是,如果可能的话,我希望能够在不修改原始源的情况下打开它。

最佳答案

您几乎肯定希望将 use Smart::Comments 添加到包含此类内容的模块中,然后 flip the switch in your environment通过适当设置$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

Ordinary is dull and boring, of course. With run-foo, we take bold, dashing steps!

#! /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";

(请原谅它的紧凑性:我缩小了它,以便它全部适合一个未滚动的 block 。)

输出:

$ ./run-foo### $i: 0### $i: 1### $i: 2### $i: 3### $i: 4024

万岁!

@INC hooks我们可以替换我们自己的或修改过的来源。该代码监视对程序直接使用的 require 模块的尝试。命中时,inject_smart_comments 返回一个迭代器,一次生成一行。当这个狡猾、巧妙的迭代器看到包声明时,它会向该 block 附加一个看起来无辜的 use Smart::Comments ,使其看起来好像它一直在模块的源代码中一样。

例如,通过尝试使用正则表达式解析 Perl 代码,如果包声明本身不在一行,则代码将会中断。调味。

关于perl - 如何在加载的模块中使用 Smart::Comments 而不更改其源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com