Perl 模块简单讲解

你是否觉得 perl 中关于模块的文档有些难懂?好的,这里有一个世界上最简单的模块,它将用于展示(demonstrate)Exporter 模块所有的特性,另外还有一段使用这个模块的脚本。同时,我们也会给出一个有关于@INC的简短说明,最后,还要讲一下有些关于 using warnings 和 use 模块的使用。 

下面是这个模块的内容: 

  MyModule.pm

  package MyModule;

  use strict;

  use Exporter;

  use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);

  $VERSION = 1.00;

  @ISA = qw(Exporter);

  @EXPORT = ();

  @EXPORT_OK = qw(func1 func2);

  %EXPORT_TAGS = ( DEFAULT => [qw(&func1)],

  Both => [qw(&func1 &func2)]);

  sub func1 { return reverse @_ }

  sub func2 { return map{ uc }@_ }

  1;

  首先,我们将通过声明 "package" 名字来获得一个名字空间。这将确保模块中的方法与变量,和调用他们的代码所分隔开来。 use strict 在模块中是一个非常好的做法,这将使 Perl 对使用全局变量做出一定的约束。详细介绍参看 "use strict warnings and diagnostics or die" 。

  我们需要用 Exporter 模块来将我们的函数从 MyModule::namespace 输出到 main::namespace,让使用MyModule 的程序可以使用这些函数。 为了use strict,我们必须使用 use vars 来声明一些变量。当然,在5.6 版本以上我们还可以使用 our 来声明变量。我们现在设置一个 $VERSION 数值,然后通过使用 @ISA 来使得 Exporter 成为 MyModule 的一部本。想要了解 @ISA 是什么以及如何使用等细节,请参考 "perlboot"

  @EXPORT 包含了我们需要默认输出的函数列表。在这里,它是空的。一般来说,你通过默认的使用@EXPROT 输出的越少越好。因为调用该模块的程序中,有可能存在与其中函数相之冲突的函数或者代码。如果程序需要调用某个指定的函数,那么,就请就让它主动请求。

  @EXPORT_OK 包含了我们在调用时需要输出的函数列表,我们只输出了 &func1 和 &func2,这种方法要优先于盲目地使用 @EXPORT 来输出函数。你也可以输出像 $CONFIG 这样全局的、不是用 my 定义的字义范畴的变量。(可参考用 "our" 或者 use vars 来声明全局变量) %EXPORT_TAGS。为了方便起见,我们定义了两套输出标签。‘:DEFAULT’标签只输出 &func1;‘:Both’标签则输出 &func1 和 &func2。这个哈希表存储指向数组引用的标签。注意:在这里的数组是匿名的。

  最后,我们需要在模块结尾加上一个“1;”。因为当 perl 装载一个模块时,它会实现查看这个模块是否能在最后返回一个真值,并且据此判断该模块是否已装载成功。当然,你可以在最后面添加任何真值(参看 "Code::Police" ),但其中1是最方便的。 

  MySciprt.pl(使用 MyModule 的一个例子)

  #!/usr/bin/perl -w

  use strict;

  # you may need to set @INC here (see below)

  my @list = qw (J u s t ~ A n o t h e r ~ P e r l ~ H a c k e r !);

  # case 1

  # use MyModule;

  # print func1(@list),"/n";

  # print func2(@list),"/n";

  # case 2

  # use MyModule qw(&func1);

  # print func1(@list),"/n";

  # print MyModule::func2(@list),"/n";

  # case 3

  # use MyModule qw(:DEFAULT);

  # print func1(@list),"/n";

  # print func2(@list),"/n";

  # case 4

  # use MyModule qw(:Both);

  # print func1(@list),"/n";

  # print func2(@list),"/n";

  正如上面所见,我们在 Myscript.pl 中使用了 MyModule。把中间的注释符号都去掉来看看会发生什么。一次都去掉即可。

  Case1:因为我们的模块默认什么都没有输出(没有输出 &func1 和 &func2),所以我们会得到一个他们在 main:: namespace 中不存在的错误。

  Case2:这个运行正常。我们让模块输出了 &func1,于是我们可以正常使用它。尽管我们没有输出 &func2,但是我们使用的是 &func2 完整的包路径,所以它也可以正常工作。

  Case3:‘:DEFAULT’标签应该输出 &func1,所以你应该希望返回一个缺少 &func2 函数的错误。但事实上perl却偏偏找上了 &func1 的麻烦(错误信息提示未定义 &func1 函数)。

  恩,这里怎么了呢?原来,DEFAULT 这个标签名字是特殊的,在我们的模块中,%EXPORT_TAGS 哈希表它会被自动设置成这样 DEFAULT=>/@EXPROT。也就是说,DEFAULT 默认导出的是来自 @EXPROT 数组的函数。

  Case4:我们指定通过‘:Both’标签实现两个函数都输出,他实现了。 *关于 @INC 的注意事项* 当你提交一个 use MyModule 的时候,就会指示perl去搜索@INC数组中是否有此模块名。@IN C通常包含: 

  /perl/lib 

  /perl/site/lib.

  “.”这个目录表示当前的工作目录。核心模块是安装在 perl/lib 目录中,非核心模块安装在perl/site/lib 目录中。你可以向@INC中添加自定义目录。像下面这样:

  BEGIN { push @INC, '/my/dir' }

  # or

  BEGIN { unshift @INC, '/my/dir' }

  # or

  use lib '/my/dir';

  我们需要使用 BEGIN 块在编译时向 @INC中 添加值,此时是 perl 检查模块的时刻。

  如果你等到程序被编译的时候就太晚了,perl 会抛出一个异常,说“在 @INC 中无法找到 MyModule”。使用 push 还是 unshift 方法添加值的区别是,perl 搜索 @INC 的顺序是从 @INC 中的第一个目录开始的。如果你在 /perl/lib/、/perl/site/lib/ 和 ./ 中都有一个MyModule模块的话,那么 /perl/lib中 的模块将首先被找到并使用。use lib 用法可以起到和BEGIN{unshift @INC,$dir}一样的效果-请参看 "perlman:lib:lib":Perl 模块简单讲解 - teddy-1234 - 不断的思考,不断的进步http://www.perlmonks.org/?node= perlman%3Alib%3Alib 

  *use Foo::Bar 意味着什么

  * use Foo::Bar 并不意味着在@INC的目录中寻找一个叫做 Foo::Bar.pm 的模块文件。它的意思是在@INC的目录中寻找一个叫做‘Foo’的 “子目录”,然后在其中找一个叫做“Bar.pm”的“模块”。现在,如果我们成功 "use" 了一个模块,那么我们就可以通过完整的包路径语法 & PACKAGE::FUNCTION 使用这个模块中的所有函数。当我们说 &Foo::Bar::some_func 的时候,我们指的是“包的名字”而不是那个在 use 中曾使用的包含路径的文件名。这会允许你可以在一个 use 过的文件中包含很多包名字。实际使用中这些名字通常是相同的。 

  use warnings;

  你应该打开 warnings 来检测你的模块,因为它可以检测出很多细微的错误。你可以通过在测试模块代码中添加-w参数来打开警告选项。如果你在模块中添加了 use warnings,那么你的模块必须要求运行在 perl5.6 以上,否则不支持。如果你在模块的顶端添加了 $^W++,那么你将会在全局范围内打开警告选项-这将影响到其他模块,你最好只在你自己的程序中这么使用,因为这略显霸道了一些。这有一个专家写的叫做 "tye":http: //www.perlmonks.org/?node=tye 的代码来测试警告选项,但没有直接将它包含进他/她自己的模块中。希望这些会讲清楚它是怎样工作的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Perl/Tk是一个Perl模块,它提供了一个图形用户界面(GUI)的工具包,可以用来创建跨平台的窗口和对话框。下面是一些Perl/Tk的中文讲解: 1. 安装Perl/Tk模块 要使用Perl/Tk,您需要先安装Perl/Tk模块。您可以使用CPAN或者其他的包管理器来安装它。例如,在Linux系统中,您可以使用以下命令来安装Perl/Tk模块: ``` sudo apt-get install libperl-tk-perl ``` 2. 创建一个简单的窗口 您可以使用Perl/Tk来创建一个窗口,如下所示: ```perl use Tk; my $mw = MainWindow->new; $mw->title("Hello, World!"); $mw->Label(-text => "Hello, World!")->pack; MainLoop; ``` 这个程序创建了一个名为“Hello, World!”的窗口,并在窗口中放置了一个标签,标签上显示了“Hello, World!”这个文本。MainLoop函数用于启动窗口的事件循环。 3. 创建按钮和事件处理程序 您可以使用Perl/Tk来创建按钮,并在用户点击按钮时执行事件处理程序,如下所示: ```perl use Tk; my $mw = MainWindow->new; $mw->title("Button Example"); my $button = $mw->Button(-text => "Click Me!", -command => \&button_click)->pack; sub button_click { print "Button clicked!\n"; } MainLoop; ``` 这个程序创建了一个名为“Button Example”的窗口,并在窗口中放置了一个按钮,按钮上显示了“Click Me!”这个文本。当用户点击按钮时,会执行button_click函数,这个函数会输出“Button clicked!”这个文本。 4. 创建菜单和子菜单 您可以使用Perl/Tk来创建菜单和子菜单,如下所示: ```perl use Tk; my $mw = MainWindow->new; $mw->title("Menu Example"); my $menubar = $mw->Menu(); $mw->configure(-menu => $menubar); my $file_menu = $menubar->cascade(-label => "File"); $file_menu->command(-label => "Open", -command => \&open_file); $file_menu->separator(); $file_menu->command(-label => "Exit", -command => sub { exit }); sub open_file { print "Opening file...\n"; } MainLoop; ``` 这个程序创建了一个名为“Menu Example”的窗口,并在窗口中放置了一个菜单。菜单有一个名为“File”的子菜单,子菜单中有两个命令:“Open”和“Exit”。当用户点击“Open”命令时,会执行open_file函数,这个函数会输出“Opening file...”这个文本。当用户点击“Exit”命令时,会退出程序。 以上是一些简单Perl/Tk的中文讲解,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值