博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
包和模块
阅读量:4050 次
发布时间:2019-05-25

本文共 1973 字,大约阅读时间需要 6 分钟。

-- Start

require

如果我们有一个 date.pl,其中包含了一些关于日期操作的函数,如下:

#!/usr/bin/perlsub getToday {	my (undef,undef,undef,$mday,$mon,$year) = localtime(time);	return sprintf("%04d%02d%02d", $year + 1900, $mon +1, $mday);}# 必须返回一个布尔型的真值,否则 require 时会报错return 1;

现在我想在自己的脚本中使用 date.pl 中的函数该怎么办呢?很简单,使用 require 将 date.pl 包含进来就可以了,下面是一个简单的例子。

#!/usr/bin/perl# Perl 会在内置数组 @INC 指定的目录中寻找文件date.pl# 如果 @IN C中有多个目录中含有同一个文件,则只有第一个被包含push(@INC, "D:/Development/Perl");# 使用 require 将 date.pl 包含到我们的脚本中require "date.pl";# 调用 date.pl 中的函数my $today = &getToday();print "Today is $today\n";

如果自己的脚本中也有 getToday 函数会发生什么呢?Perl 会忽略自己脚本中的函数,而使用 date.pl 中的函数。这将导致我们无法调用自己定义的函数,那如何避免这种名字冲突呢?答案就是使用包。

我们将上面的例子稍作修改来演示包的使用。

#!/usr/bin/perl# 用包实现名字空间# 下面的例子定义了 date 包# 事实上,任何代码都属于某个包,如果没有显示指定包名,则默认属于 main 包package date;sub getToday {	my (undef,undef,undef,$mday,$mon,$year) = localtime(time);	return sprintf("%04d%02d%02d", $year + 1900, $mon +1, $mday);}# 必须返回一个布尔型的真值,否则 require 时会报错return 1;

 

#!/usr/bin/perlpush(@INC, "D:/Development/Perl");require "date.pl";# 调用 date.pl 中的函数,需要指定包名my $today = &date::getToday();print "Today is $today\n";# 调用自定义的同名函数my $today = &getToday();print "Today is $today\n";# 自定的函数sub getToday {	my (undef,undef,undef,$mday,$mon,$year) = localtime(time);	return sprintf("%04d-%02d-%02d", $year + 1900, $mon +1, $mday);}

模块

如果我们想把 date.pl 发布给其他人使用,我们最好将它定义成一个模块,创建模块非常简单,使用包来创建模块。我们将上面的例子稍作修改来演示如何创建模块。

我们将 date.pl 改名为 date.pm,其他不做任何修改。下面的例子演示如果使用 date.pm 模块。

#!/usr/bin/perl# 使用模块use date;# 调用 date 模块中的函数my $today = &date::getToday();print "Today is $today\n";# 调用自定义的同名函数my $today = &getToday();print "Today is $today\n";# 自定的函数sub getToday {	my (undef,undef,undef,$mday,$mon,$year) = localtime(time);	return sprintf("%04d-%02d-%02d", $year + 1900, $mon +1, $mday);}

use 和 require 的区别

use 和 require 都可以将模块导入到我们的程序中,它们之间的区别在于,无论 use 处于脚本的何处,它总是在其他语句执行之前执行,而 require 语句执行的时机和它所处的位置有关。

 

-- 更多参见:

-- 声 明:转载请注明出处

-- Last Updated on 2012-07-07
-- Written by ShangBo on 2012-07-07
-- End

 

你可能感兴趣的文章
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>
【leetcode】Clone Graph(python)
查看>>
【leetcode】Sum Root to leaf Numbers
查看>>
【leetcode】Pascal's Triangle II (python)
查看>>