perl的包含文件
require ("myfile.pl");
基本的包含文件全过程
- 建立一个include文件,就按整个的perl script文件格式建立,文件中写sub
[macg@localhost perltest]$ vi file1.pl
#!/usr/bin/perl sub gotest{ open (MYFILE, $tmp[0]) || die ("Could not open file"); close(MYFILE); |
- 主perl文件require上边的包含文件,引用定义在包含文件中的sub
[macg@localhost perltest]$ vi tip.pl #!/usr/bin/perl require ("file1.pl"); $file="/home/macg/perltest/gogo"; @arrary=qw(a b cc dd); |
[macg@localhost perltest]$ ./tip.pl file1.pl did not return a true value at ./tip.pl line 3. |
上面哪里错了? 包含文件,必须return一个1
[macg@localhost perltest]$ vi file1.pl
#!/usr/bin/perl sub gotest{ open (MYFILE, $tmp[0]) || die ("Could not open file"); close(MYFILE); 1; |
[macg@localhost perltest]$ ./tip.pl good $line is :I WANTWANT TO go to NY. And I also wWant to be DC. |
变量$_的值即作为文件名传递给require
#!/usr/bin/perl require ("testdir/file1.pl"); $file="/home/macg/perltest/gogo"; |
[macg@localhost perltest]$ ls -F file1.pl [macg@localhost perltest]$ ls testdir file1.pl [macg@localhost perltest]$ ./tip.pl |
不用全路径名,而require文件又不在当前路径下,怎么办?
[macg@localhost perltest]$ vi tip.pl
#!/usr/bin/perl require ("file1.pl"); $file="/home/macg/perltest/gogo"; |
[macg@localhost perltest]$ ./tip.pl Can't locate file1.pl in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi at ./tip.pl line 3. |
把file1.pl所在目录放入@INC系统变量中
[macg@localhost perltest]$ vi tip.pl #!/usr/bin/perl unshift (@INC, "/home/macg/perltest/testdir"); $file="/home/macg/perltest/gogo"; |
[macg@localhost perltest]$ ./tip.pl good $line is :I WANTWANT TO go to NY. And I also wWant to be DC |
@INC
[macg@localhost perltest]$ vi tip.pl
@arraytest=qq(hello "test" world); |
[macg@localhost perltest]$ ./tip.pl /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.6/i386-linux-thread-multi /usr/lib/perl5/5.8.6 |
修改@INC
[macg@localhost perltest]$ vi tip.pl
#!/usr/bin/perl |
[macg@localhost perltest]$ ./tip.pl /home/macg/www /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.6 . /home/macg |
push 或unshift @INC只对当前文件执行时刻有效,没有global效果。
以下为我自己根据项目中实践结果添加。
perl参数-I可以加入模块路径,如文件test.pl内容如下:
#! /usr/bin/perl -w use strict; use Data::Dumper; print "hello world!\n";
如果perl默认模块目录中没有strict模块或者Data::Dumper模块,则直接调用perl ./test.pl可能会报错,@INC中目录里可能没有此处调用的模块。
但如果目录/home/usr_name/lib_test中有这两个模块,我们可以这样调用:perl -I/home/usr_name/lib_test ./test.pl就可以成功。