Perl--包和模块

模块就是用包来实现的

使代码段不发生冲突而用以分开代码的空间。
把变量和函数分为不同区间的标记。不同空间中的变量或函数可以同名。使用变量要带上名空间的前缀$name::a。


用包来实现名字空间

一个包就是一个文件

Perl5 用包来创建模块:

require: 类似C语言的include 把其他地方写好的程序包含进来

require 运行到时才把程序包含进来


use 把模块导入你的Perl程序中

将模块导入你的Perl程序中使用use语句 use Mymodule;
这样,模块Mymodule中的子程序和变量就可以使用了。
取消导入模块使用no语句

, no Mymodule;
1。编译时运行:use相当于在BEGIN{}中执行,把use用于互斥条件会出错。if(con){use mod1;}else{use mod2;}实际

上是use mod1;use mod2;if(con){}else{}当mod2不存在是出错。此时用require.
2。带参数的use add 2,2;使用import函数接收参数

('add',2,2)
	use mod ('a','b')只引入a,b
3. use strict;
    use Config编译环境存在%Config中,如Config{'osname'};
    use 

vars想使用全局变量,但又用了strict(使用my). use vars qw($file);


use strict;

变量必须是my声明

use vars想使用全局变量,但又用了strict(使用my). use vars qw($file);

在 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 $_};


使用模块的例子:

[oracle@june2 perl]$ cat a1.pl 
#!/usr/bin/perl
use  integer;
$result = 2.4 + 2.4;
print "$result
";

no integer;
$result = 2.4 + 2.4;
print "$result
";
[oracle@june2 perl]$ perl a1.pl 
4
4.8

如果use或no语句出现在语句块中,则只在该块的有效范围内起作用
模块的说明,常嵌入在模块中用perldoc mod来查看
















原文地址:https://www.cnblogs.com/hzcya1995/p/13351963.html