大佬教程收集整理的这篇文章主要介绍了在perl中检测声明的包变量,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
# package main; our $f; sub f{} sub g {} 1;
如何确定已声明$f而非$g?关闭袖口,我认为* {main :: g} {SCALAR}可能是未定义的,但它是一个真正的SCALAR参考.
背景:我想将变量导入main ::,但是如果已经声明了该变量,则将carp或croak导入.
编辑添加了一个f子程序来响应@ DVK的初始答案.
答案(2010-07-27)
这并不容易,但有可能.
eval
technique是最便携的,工作在早于5.10的perls上.在最近的perls中,内省模块如Devel::Peek
和B
可以区别对待.
下面的技术将检测是否已通过声明$f
use vars qw/ $f /;
代码如下:
package Mymodule; use warnings; use Strict; # using $f will confuse the compiler,generaTing # warnings of 'Variable "%f" is not available' # although we're going for $main::f my $__f = "from Mymodule"; my %IMPORT_OK = ( '$f' => [f => \$__f],); sub import { my($pkg,@imports) = @_; my $callpkg = caller; die "I don't speak your dirty Pig-LaTin" if $callpkg !~ /\A\w+(::\w+)*\z/ || grep !/\A[\$@%]\w+\z/,@imports; foreach my $name (@imports) { my($sym,$ref) = @{ $IMPORT_OK{$namE} || [] }; die "unknown import: $name" unless $sym; open my $saverr,">&",\*STDERR or die "dup STDERR: $!"; close STDERR; my $declared = eval qq{ package $callpkg; my(undef)=$name; 1; }; open STDERR,$saverr or print "restore STDERR: $!"; die "${Callpkg}::$sym already exists" if $declared; { no Strict 'refs'; *{$callpkg . "::" . $sym} = $ref; } } } 1;
以上是大佬教程为你收集整理的在perl中检测声明的包变量全部内容,希望文章能够帮你解决在perl中检测声明的包变量所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。