perl-模块

发现一个规律,早上学习效率高,下午效率低,晚上效率又高起来了。很开心的发现一件事,就是我现在可以拿perl写简单的程序了,不知不觉中,感觉很快。不知道这是偏爱还是我学的太过肤浅。不管那么多了,以后多写perl程序。

module

模块是什么:是一个可重复执行的代码段,这个代码段里包含了必要的属性和方法用来实现特定的功能。

那么perl的模块就是放在了[cpan](Comprehensive Perl Archive Network )上面。[搜索页面](CPAN Search )可以搜索到相关模块。

创建自己的module

  1. 取名:modulename.pm
  2. 在文件开头写package modulename,这样会让模块成为一个package
  3. 在文件最后写1;,让文件返回为true

模块的导入和使用

三种导入方式:

  1. do:从@INC路径搜索模块,如果没找到,会自动忽略
  2. require:如果没找到模块会报错,重复导入会忽略
  3. use:在程序启动之前导入模块,这也是最常用的

调用函数:

使用双冒号,但是perl6中改为使用点了。

module_name::subroutine_name

日志模块举例

新建模块

  1. 首先确定好模块名字:FileLogger
  2. 建模块文件FileLogger.pm

第一种写法:这里省去了很多的接受参数的步骤,而是使用了默认取值方式

函数接受到的参数默认放入了@_数组中,所以可以通过索引取值$_[index]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package FileLogger;

my $LEVEL = 1;

sub set_level{
$LEVEL = $_[0] if($_[0] =~ /^\d+$/);
}

sub open{
open(LFH,'>>',$_[0]) or die "cann’t open file $_:$!";
}

sub log{
print(LFH,$_[1],"\n") if($_[0] >= $LEVEL);
}

sub close{
close LFH;
}

1;

第二种写法:这里就使用了shift来接受参数重新赋值给变量,以及将@_重新赋值给了数组。等于说是复制了一份,这么做的好处就是不会对传进来的源数据有任何影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package FileLogger;

my $LEVEL = 1;

sub set_level{
my $level = shift;
$LEVEL = $level if($level =~ /^\d+$/);
}

sub open{
my $log = shift;
open(LFH,'>>',$log) or die "cann‘t open file $log:$!";
}

sub log{
my($level,$msg) = @_;
print(LFH $msg,"\n") if($level >= $LEVEL);
}

sub close{
close(LFH);
}

1;

使用模块

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use lib '/home/narcissus/Documents/script/perl';
use FileLogger;

FileLogger::set_level(3);
FileLogger::open('test.log');
FileLogger::log(4,'like iu');
FileLogger::log(2,'not like iu');
FileLOgger::close;

除了使用函数的方法值得注意外,如何指定模块是一个很重要的步骤。因为如果仅仅只写use FileLogger那么运行时会报错,说无法找到这个模块。

所以我们需要使用use lib 模块所在目录来指定从哪里找到它。不过这仅仅是说自己写的模块,如果是下载的,那么系统早已将模块加入到了它可以找到的路径。

指定模块位置的方法:

  1. ~/.xinitrc中加入

    1
    export PERL5LIB=/home/narcissus/Documents/script/perl
  2. 在脚本中指定位置:

    1
    use lib '/home/narcissus/Documents/script/perl';

下一个目标是haskell,因为我的xmonad的topbar失效了,我又找不到失效的原因,所以这次打算好好学学,真真正正的自己写出满意的桌面来。