⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbol.pm

📁 MSYS在windows下模拟了一个类unix的终端
💻 PM
字号:
package Symbol;=head1 NAMESymbol - manipulate Perl symbols and their names=head1 SYNOPSIS    use Symbol;    $sym = gensym;    open($sym, "filename");    $_ = <$sym>;    # etc.    ungensym $sym;      # no effect    print qualify("x"), "\n";              # "Test::x"    print qualify("x", "FOO"), "\n"        # "FOO::x"    print qualify("BAR::x"), "\n";         # "BAR::x"    print qualify("BAR::x", "FOO"), "\n";  # "BAR::x"    print qualify("STDOUT", "FOO"), "\n";  # "main::STDOUT" (global)    print qualify(\*x), "\n";              # returns \*x    print qualify(\*x, "FOO"), "\n";       # returns \*x    use strict refs;    print { qualify_to_ref $fh } "foo!\n";    $ref = qualify_to_ref $name, $pkg;    use Symbol qw(delete_package);    delete_package('Foo::Bar');    print "deleted\n" unless exists $Foo::{'Bar::'};=head1 DESCRIPTIONC<Symbol::gensym> creates an anonymous glob and returns a referenceto it.  Such a glob reference can be used as a file or directoryhandle.For backward compatibility with older implementations that didn'tsupport anonymous globs, C<Symbol::ungensym> is also provided.But it doesn't do anything.C<Symbol::qualify> turns unqualified symbol names into qualifiedvariable names (e.g. "myvar" -E<gt> "MyPackage::myvar").  If it is given asecond parameter, C<qualify> uses it as the default package;otherwise, it uses the package of its caller.  Regardless, globalvariable names (e.g. "STDOUT", "ENV", "SIG") are always qualified with"main::".Qualification applies only to symbol names (strings).  References areleft unchanged under the assumption that they are glob references,which are qualified by their nature.C<Symbol::qualify_to_ref> is just like C<Symbol::qualify> except that itreturns a glob ref rather than a symbol name, so you can use the resulteven if C<use strict 'refs'> is in effect.C<Symbol::delete_package> wipes out a whole package namespace.  Notethis routine is not exported by default--you may want to import itexplicitly.=cutBEGIN { require 5.002; }require Exporter;@ISA = qw(Exporter);@EXPORT = qw(gensym ungensym qualify qualify_to_ref);@EXPORT_OK = qw(delete_package);$VERSION = 1.02;my $genpkg = "Symbol::";my $genseq = 0;my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT);## Note that we never _copy_ the glob; we just make a ref to it.# If we did copy it, then SVf_FAKE would be set on the copy, and# glob-specific behaviors (e.g. C<*$ref = \&func>) wouldn't work.#sub gensym () {    my $name = "GEN" . $genseq++;    my $ref = \*{$genpkg . $name};    delete $$genpkg{$name};    $ref;}sub ungensym ($) {}sub qualify ($;$) {    my ($name) = @_;    if (!ref($name) && index($name, '::') == -1 && index($name, "'") == -1) {	my $pkg;	# Global names: special character, "^x", or other. 	if ($name =~ /^([^a-z])|(\^[a-z])$/i || $global{$name}) {	    $pkg = "main";	}	else {	    $pkg = (@_ > 1) ? $_[1] : caller;	}	$name = $pkg . "::" . $name;    }    $name;}sub qualify_to_ref ($;$) {    return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller };}## of Safe.pm lineage#sub delete_package ($) {    my $pkg = shift;    # expand to full symbol table name if needed    unless ($pkg =~ /^main::.*::$/) {        $pkg = "main$pkg"	if	$pkg =~ /^::/;        $pkg = "main::$pkg"	unless	$pkg =~ /^main::/;        $pkg .= '::'		unless	$pkg =~ /::$/;    }    my($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/;    my $stem_symtab = *{$stem}{HASH};    return unless defined $stem_symtab and exists $stem_symtab->{$leaf};    # free all the symbols in the package    my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH};    foreach my $name (keys %$leaf_symtab) {        undef *{$pkg . $name};    }    # delete the symbol table    %$leaf_symtab = ();    delete $stem_symtab->{$leaf};}1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -