如何使用Saba从Perl脚本

任务。 有一个脚本用编程语言Perl。 它定义了一些功能(Saba). 你需要Taipalsaari这种功能在另一个脚本。

这里就是一个例子。 有一个脚本 script.pl 其中定义了Saba header. 这Saba通 串,并就返回这串在一个降价头。 在这个脚本,这Saba 用来显示两个标题:

▶ Run
#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

say header('one');
say header('two');

运行 perl script.pl 在屏幕上看到的:

## ONE
## TWO

任务是创造另一个脚本 other.pl 这也将使用萨巴。

解决方案—副本贴

简单(但是)的解决方案是复制代码的潜艇在另一个脚本。 这种解决方案得到的 这里有一个 other.pl:

#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

say header('three');

你现在可以运行,这个脚本 perl other.pl 和在屏幕上看到的文本 ## THREE.

这个问题的解决方案,但这是一个糟糕的决定。 事实上,由于相同的代码是 在几个文件就变成困难的工作与这样的代码。 当需要改变 这Saba,然后必须改变它在一些地方(和仍然必须记得改变 代码在所有适当的文件)。

该方案是把Saba在一个单独模块

正确的解决办法是做一个萨巴在一个单独模块。 对于这个 创建一个文件 lib/Utils.pm:

package Utils;

use strict;
use warnings;

use Exporter;

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(
    header
);
our @EXPORT = @EXPORT_OK;

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

1;
  • package Utils; -宣布,"图书馆" Utils
  • use strict;use warnings; —交换模式来Perl更加苛刻的很好的代码
  • 5线约 EXPORT 表明,在连接时,图书馆需要功能 header 提供
  • 移动功能
  • 1; —包应该结束的真相

在此之后的说明的功能需要从脚本 script.pl 清理,但是添加连接的图书馆:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('one');
say header('two');

然后可以运行,这同一个脚本用的命令 perl -Ilib/ script.pl. 在命令行 -I 通值 lib/ —目录Perl会 搜索图书馆。 结果,这个脚本完全相同。

和现在完全微不足道Taipalsaari同Saba在另一个脚本。 写 脚本 other.pl,这几乎是一样 script.pl:

#!/usr/bin/perl

use feature qw(say);

use Utils;

say header('three');

运行这个脚本 perl -Ilib/ other.pl 在屏幕上看到 ## THREE.

解决方案连接的脚本代码的脚本

还有另一种解决方案可以使用Saba定义的脚本中 script.pl 到Taipalsaari在脚本 other.pl. 要做到这一点,编写这一文本的文件 other.pl:

#!/usr/bin/perl

use feature qw(say);

require './script.pl';

say header('three');

运行的脚本 perl other.pl (文件 other.pl ,必须在同一文件夹脚本 script.pl). 其结果是:

## ONE
## TWO
## THREE

所以当你跑脚本 other.pl 是第一次作出的所有代码 是 script.pl (行 ## ONE## TWO),然后才运行代码从脚本 other.pl (行 ## THREE).

以当你跑脚本 other.pl 不是执行部分 script.pl 我们需要一点点 改变 script.pl. 你需要换整个码在脚本身的条件和编写的脚本 单元作为一个真正的价值:

#!/usr/bin/perl

use feature qw(say);

sub header {
    my ($string) = @_;

    return '## ' . uc($string);
}

if ( not caller() ) {
    say header('one');
    say header('two');
}

1;

现在,如果我们运行 perl script.pl,我们得到完全相同的输出以前一样, 如果你开始 perl other.pl,然后输出的将只是所需的文本 ## THREE.

关键字 caller 返回一个不同的价值取决于你如何开始 脚本。 这个特征,我们在这里使用的分裂运行直接的脚本 连接的脚本中使用 require.

其他文章