在 Perl 里,一个名字空间叫一个包。
构造含义
$days 简单标量值 $days
$days[28] 数组 @days 的第二十九个元素
$days{'Feb'} 散列 %days 的“Feb”值
构造含义
${days} 和 $days 一样,不过在字母数字前面不易混淆
$Dog::days 在 Dog 包里面的不同的 $days 变量
$#days 数组 @days 的最后一个索引
$days->[28] $days一个引用指向的数组的第二十九个元素
$days[0][2] 多维数组
$days{200}{'Feb'} 多维散列
$days{2000,'Feb'} 多维散列枚举
Perl 里的符号表也被称为包(package),因此这些变量常被称为包变量
任何提到 $Dog::bert 的程序都是获取位于 Dog:: 包的变量 $bert
main默认的包名,没有单独的文件
包定义:
名字空间namespace:
使代码段不发生冲突而用以分开代码的空间。
把变量和函数分为不同区间的标记,不同空间中的变量或函数可以同名。使用变量要带上名空间的前缀$name::a
包定义 package mypack;
得到main包所有的变量名:
[oracle@jhoa 2]$ cat 1.pl
foreach $key (keys %main::)
{print "$$key => $main::{$key}
";}
[oracle@jhoa 2]$ perl 1.pl
$/ => *main::/
$stderr => *main::stderr
$key => *main::key
$utf8:: => *main::utf8::
$" => *main::"
$CORE:: => *main::CORE::
$DynaLoader:: => *main::DynaLoader::
$stdout => *main::stdout
$attributes:: => *main::attributes::
$ => *main::
$stdin => *main::stdin
$ARGV => *main::ARGV
$INC => *main::INC
$ENV => *main::ENV
$Regexp:: => *main::Regexp::
$UNIVERSAL:: => *main::UNIVERSAL::
$$ => *main::$
$_<perlio.c => *main::_<perlio.c
$main:: => *main::main::
$- => *main::-
$_<perlmain.c => *main::_<perlmain.c
$PerlIO:: => *main::PerlIO::
$_<universal.c => *main::_<universal.c
$0 => *main::0
=> *main::
$@ => *main::@
$_<xsutils.c => *main::_<xsutils.c
$STDOUT => *main::STDOUT
$IO:: => *main::IO::
$ => *main::
$_ => *main::_
$+ => *main::+
$STDERR => *main::STDERR
$Internals:: => *main::Internals::
$STDIN => *main::STDIN
$DB:: => *main::DB::
$<none>:: => *main::<none>::
[oracle@jhoa 2]$ cat 1.pl
foreach $key (keys %main::)
{print "$$key => $main::{$key}
";}
得到变量$a的值print ${$main::{'a'}};
存储变量和子程序的名字的缺省符号表为main包,如果在程序里定义了其它的包,当你想切换回去使用缺省的符号表,可以重新指定main包。
2.5.1 名字查找
常用通用含义替换
' ' q// 文本字串否
" " qq// 文本字串是
` ` qx// 执行命令是
() qw// 单词数组否
// m// 模式匹配是
s/// s/// 模式替换是
y/// tr/// 字符转换否
" " qr// 正则表达式是
[oracle@jhoa 2]$ cat 2.pl
unlink('aa');
删除aa文件
[oracle@jhoa 2]$ cat 3.pl
@files=qw/1 2 3 4 5 6/;
while (@files) {
my $file = shift @files;
print "$file is $file
";
}
[oracle@jhoa 2]$ perl 3.pl
$file is 1
$file is 2
$file is 3
$file is 4
$file is 5
$file is 6
[oracle@jhoa 2]$ cat 4.pl
@stuff = ("one", "two", "three"); $stuff = @stuff;
print "$stuff is $stuff
";
2.11.2 行输入(尖角)操作符
@line = <STDIN>;
foreach (@line){
print "$_ is $_
";
};
@line = <>;
foreach (@line){
print "$_ is $_
";
};
<> 指定文件获得
<STDIN>获取标准输入
2.11.3 文件名聚集操作符
@files=<*.pl>;
foreach (@files){print $_};