Perl导入代码文件
从函数复用开始当我们定义了一个功能比较通用的子程序,比如获取数值的绝对值。想要到处使用这个子程序,就得不断复制、粘贴这段绝对值函数的定义文本。显然,这是不太理想的方式。 于是,就将包含这个子程序的代码放进一个perl文件,然后通过特殊的语法去导入这个文件。 例如,文件sum.pl包含一个sum子程序,该子程序返回参数相加之和。 #!/usr/bin/env perl # 注意,这里为了测试,没加use strict sub sum { my $sum; $sum = map { $_ + $sum } [email?protected] $name; } $name="longshuai"; # 全局变量属性 eval语句导入文件可以在其它perl文件中(如eval.pl)通过eval语句临时编译这个文件(sum.pl)中的语句。只不过在eval之前,需要先将sum.pl文件中的内容读取: #!/usr/bin/env perl # use strict; use warnings; use 5.010; open my $fh,"<","sum.pl" or die "Can't open file: $!"; undef $/; my $sum_code=<$fh>; # 读取代码保存到变量中 close $fh; eval $sum_code; # eval评估编译这段代码,并执行 die [email?protected] if [email?protected]; my $sum=sum(1,2,3); # 引用来自sum.pl的函数 say $sum; 上面的代码会报错。因为 eval CODE; 所以,来自sum.pl中的全局属性 eval中来自sum.pl的代码将能访问它所在代码块的词法变量。 do语句导入文件也可以通过do语句临时编译这个文件,它将在当前程序(无论do语句是否是在代码块中)引入编译的结果(但除了子程序外的其它属性,由于一般会加上 #!/usr/bin/env perl # use strict; use warnings; use 5.010; { do 'sum.pl'; die [email?protected] if [email?protected]; my $sum=sum(1,3); say $sum; # say $name; # 因为use strict的存在,而报错 } say sum(2,3,4); # 出了语句块,函数仍有效 注意,do语句是在当前文件中引入变异结果,而不是当前代码块。 require导入文件想象一下,如果在myperl.pl中使用do一次性导入两个文件sum1.pl、sum2.pl: do 'sum1.pl'; die [email?protected] if [email?protected]; do 'sum2.pl'; die [email?protected] if [email?protected]; 假设sum2.pl中也用了do语句导入sum1.pl,这样将会在myperl.pl中多次导入sum1.pl。其实第二次导入是多余的,尽管两次导入的内容是完全一致的,而且如果开启了 因此,需要一种跟踪文件导入情况的功能。使用require语句即可。 require 'sum1.pl'; require 'sum2.pl'; require会在hash结构 为了跟踪是否曾经导入成功,要求所导入的文件最后要返回一个true,一般都会使用数值1作为所导入文件代码的结尾。并非一定是1,也可以是其它值,只要能表示最后这个文件是成功的就行。 例如,sum1.pl中: #!/usr/bin/env perl use strict; use warnings; use 5.010; sub sum { my $sum; $sum = map { $_ + $sum } [email?protected] $name; } 1; # 最后一行用1表示成功 以下是require相关的几点特性:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |