Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在perl中检测声明的包变量大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_772_0@
特定
# 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::PeekB可以区别对待.

解决方法

我尽我所能,甚至试图询问eval StriNG是否已经通过我们或我的声明$main :: f. (这需要重复,关闭,以及稍后恢复STDERR以减少干扰.)一旦你更改了包,那些临时转回的声明就不再可见了.

下面的技术将检测是否已通过声明$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,请注明来意。