gpt4 book ai didi

perl - 是否有可能欺骗 Perl 使用变量 %INC 并仍然保持全局 %INC 不变?

转载 作者:行者123 更新时间:2023-12-02 07:06:25 26 4
gpt4 key购买 nike

我刚刚找到了一个我们正在使用的脚本,它有一个子程序,里面写着 my %INC,它存储了一些关于激励的值,因此 %INC。这似乎从来都不是问题,或者从来没有人注意到。对我来说,它产生了 20 屏的重新定义警告,因为 %INC,包含 Perl done、required 或 的所有文件名>使用d,非常大,现在是('stuff' => 123)

我真的必须去重命名子中对此的每个引用,还是有其他方法让 Perl 原谅这个......?


这是输出的一部分:

print Dumper \%INC; # I added this line
my %INC;
print Dumper \%INC; # I added this line
exit; # I added this line

输出:

          [...]
'SqlConnect.pm' => 'lib1/SqlConnect.pm',
'Lib/RateRequest.pm' => 'Lib/RateRequest.pm'
};
$VAR1 = {};
[Fri Jun 29 16:09:13 2012] live_batch_test.pl: Subroutine export_fail redefined at /usr/lib/perl5/5.14.2/Carp.pm line 43.
[Fri Jun 29 16:09:13 2012] live_batch_test.pl: Subroutine _cgc redefined at /usr/lib/perl5/5.14.2/Carp.pm line 45.
[Fri Jun 29 16:09:13 2012] live_batch_test.pl: Subroutine longmess redefined at /usr/lib/perl5/5.14.2/Carp.pm line 51.
[Fri Jun 29 16:09:13 2012] live_batch_test.pl: Subroutine shortmess redefined at /usr/lib/perl5/5.14.2/Carp.pm line 71.
[...] (Snipped like 20 screens of redefine warnings)

警告仅在我创建我的类之一的对象时显示(它恰好包含 SOAP::WSDL,因此其中包含很多内容)。我不确定为什么这些是重新定义警告。如果 %INC 是空的,它怎么知道东西正在被重新定义?


更新:

看起来你实际上可以创建词法my %INC

use strict; use warnings; use Data::Dumper;
print Dumper \%INC;
{
my %INC = ('asdf' => 'asdf');
print Dumper \%INC;
}
print Dumper \%INC;

产生(剪断):

          'feature.pm' => 'C:/Perl/lib/feature.pm'
};
$VAR1 = {
'asdf' => 'asdf'
};
$VAR1 = {
'warnings/register.pm' => 'C:/Perl/lib/warnings/register.pm',

我的问题似乎不是 my %INC,而是脚本中的 %INC = &sub_that_has_my_percent_INC_and_returns_it() 我实际上必须 要求。现在,反过来,也有 use vars qw(%INC)。更换它……好吧,我不确定那会破坏什么。

最佳答案

全局变量%INC(或%main::INC%::INC)是一个完全不同于词法变量的变量作用域 %INC,使用 my 创建。您可以在子例程中安全地使用 my %INC

关于perl - 是否有可能欺骗 Perl 使用变量 %INC 并仍然保持全局 %INC 不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263543/

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