如何理解Perl语言中的Glob
发布网友
发布时间:2022-12-10 07:28
我来回答
共1个回答
热心网友
时间:2023-11-04 09:20
本文假设你对Perl引用已经有所了解。 关于Perl glob,笔者建议阅读《Advanced Perl Programming》第一版的第三章和第二版的第一章。本文是笔者经过阅读以上内容并经过一些实践后完成的。 我们都知道Perl的引用类似C语言的指针。 C指针:
my $a = 3; my $ra = \$a; 引用都可以简单地看成是存储了变量的地址: $a$ra3变量$a的地址在各种语言里,都有符号表(Symbol Table)的概念。符号表存储着各种作用域里的符号(Symbol)。这里说的Symbol是指我们编程时用到的各种名称,包括变量名、函数名等。比如上面的“a”、“pa”、“ra”等都是symbol。看下面的代码: my $a = "sdd"; my $b = 34; my @b = (2,3); my %b = (name => 'me', age => 28); sub b { print "hello\n"; } 产生的符号表: ......symbol a变量$a的地址......symbol b$b的地址@b的地址%b的地址函数b的地址......可以看到symbol b里存放了好几个变量和函数的引用。在Perl里,symbol也可以被叫做glob。symbol b和symbal a可以分别用*b和*a表示。 glob的一个基本应用是alias(别名): $a = 10; *b = *a; print $b . "\n"; $b = 20; print $a . "\n"; 运行结果: 10 20 符号表: ......*a\$a......*b\$a......通过将引用赋给glob可以实现部分别名: $a = 6; @a = (1,2); @b = (5,6); print $a . "\n"; *b = \$a; $b = 7; print $a . "\n"; 输出: 6 7 符号表: ......*a\$a\@a......*b\$a\@b......可以看到,只是标量一样了,数组还是各自的。 还可以用于参数传递: sub change { *b = shift; $b = "cc"; } $a = "tt"; print $a . "\n"; change(*a); print $a . "\n"; 运行结果: tt cc 据说通过glob传递参数要比传引用快很多。 不同的作用域有不同的符号表:函数拥有自己的符号表,各个包也有自己的符号表。注意!