IT运维流程库历史主题 · 只读
← 返回目录

一步一步研究OTRS(02)

一步一步研究OTRS(02)
Kernel::System::Web::InterfaceAgent; 第一句: package Kernel::System::Web::InterfaceAgent; package的作用是定义包的名称,之后所定义的所有变量和子程序都储存在这个包中,直到遇到另一个package语句。 在程序里面可以任意在包之间切换,比如: package pack1; $var = 1; package pack2; $var = 2; package pack1; print $var; 运行该程序将会输出:“1”。 在Perl中,有个特殊的包:main,存贮变量和子程序的名字的缺省符号表是与名为main的包相关联的。如果在程序里定义了其它的包,当你想切换回去使用缺省的符号表,可以重新指定main包: package main; 这样,接下来的程序就好象从没定义过包一样,变量和子程序的名字象通常那样存贮。 在Perl中,引用一个包中的变量或子程序可以使用如下格式之一: 包名::变量名 包名’变量名 建议使用第一种方式,未来可能会淘汰第二种方式。 另外,有一些特殊变量即使在包中调用,仍在main包中起作用,他们是: 文件变量:STDIN,STDOUT,STDERR和ARGV 变量:%ENV,@INC,$ARGV和@ARGV 其它含有特殊字符的系统变量 另外,你可以在perldoc上找到详细的介绍,如果你不惧en;另外,这些文章我都尽量转载到我的BLOG中,以下是Package的perldoc: u/29953/showart_303926.html
搞清楚了包的概念,再升级到模块就容易了。 大型开发中,一般会把程序分割成多个部分,每个部分完成特定的任务,这样提高了代码的重用性,也使得开发工作更易管理,那这每个部分就被称为模块。 创建模块很简单,只要把包存为同名的,后缀为pm的文件就好了,比如名为module的包保存为module.pm。 另外请注意,在模块的最后一定要加入: 1; 否则模块不能被正确识别。 那么引用一个模块可以使用use语句,如: use Kernel::System::Web::InterfaceAgent; 引用模块以后就可以直接使用模块里面定义的方法了。 Perl的发行版中,内置了很多模块,另外还有一个很好的东东CPAN,这我会另开专题讨论,使用起来还是很简单的,你可以自己去查看h 。
模块的开发涉及到Perl的面向对象编程,事实上Perl并不是真正的面向对象,它采用了一个很狡猾的办法以达到面向对象的目的,这个暂不讨论。 好了,回到OTRS,接下来的一句是 use strict; 这个说起来也可以长篇大论了(Perl里面随便一个东西都可以长篇大论,如果大学论文不知道怎么写,来学习Perl吧),我这里只是简单的说几句,当你的程序超过一页时,请务必使用use strict,它会强迫你使用my定义变量,这样基本可以避免因为拼写造成的错误,这时如果你使用了没有用my定义的变量会收到如下错误: Global symbol "$aaaa" requires explicit package name at ./this.pl line 5. 查看你的程序,第五行你会发现没有用my定义的变量。 当然还有用use warning或者直接在命令行参数里用“#!/usr/bin/perl –w”的,这里不再详细介绍,当然这些都不能完全解决问题,但是一个比一个懒的Perl 程序员,你想去超过500行的代码里查找一个拼写错误吗? 接着往下看 use vars qw($VERSION @INC); $VERSION = '$Revision: 1.17.2.1 $'; $VERSION =~ s/^\$.*:\W(.*)\W.+?$/$1/; 这里给出了这个模块的版本号 然后是引用了一大堆模块: # all framework needed modules use Kernel::Config; use Kernel::System::Log; use Kernel::System::Main; use Kernel::System::Encode; use Kernel::System::Time; use Kernel::System::Web::Request; use Kernel::System::DB; use Kernel::System::Auth; use Kernel::System::AuthSession; use Kernel::System::User; use Kernel::System::Group; use Kernel::System::Permission; use Kernel::Output::HTML::Layout; 先打住吧,我想想是深入这些模块还是接着往下看。