如何创建自己的模块以便在Perl中重用?

时间:2015-03-12 08:41:02

标签: perl

我希望创建自己的模块,我想使用该模块名称进一步使用。主要概念是:创建一个模块,其中应包含行计数,字数和字符数的子程序,在主程序中我应该使用该模块,我应该读取文件,输出应该显示总行数,总数该文件中的单词数和总字符数。

package Countsample;

use strict;
use base"Exporter";
use 5.010;

our @EXPORT=qw/line_count/;

sub line_count
{my $line=@_;
return $line;
}

1;

以上文档保存在Count.pm

#!usr/bin/perl

use Countsample;
open FH,"text1.txt";
line_count();
print"$line\n";

以上代码以Count1.pl格式保存。

我认为这些信息足以创建,如果您需要任何进一步的信息,请告诉我。

请帮我完成这项任务。

2 个答案:

答案 0 :(得分:2)

让我们从模块开始。已经提到过,通常的做法是将文件命名为它包含的包。

并且有一个原因:使用名称的use建立在路径列表(@INC)中某处文件的期望的基础上该名称包含匹配的名称空间声明(package whatever)的模块。这种联系可以实现Exporter首先做的事情。

http://perldoc.perl.org/Exporter.html

这里可以找到更深入但更简洁的解释 http://www.perlmonks.org/?node_id=102347

因此文件名为Countsample.pm

package Countsample;

use strict;
use warnings;

use base "Exporter";
use 5.010;

our @EXPORT=qw/line_count/;

sub line_count
{
    my ($fd) = (@_);

    my $lines = 0;
    while (<$fd>) {
          $lines++
    }
    return $lines;
}

1;

我添加了use strictuse warnings以获得有关错误的通知。

然后我改变了论点的分配; @_中的参数是一个列表,因此我将这些参数分配给左侧的列表(请参阅$fd周围的括号)。你可以用

my $fd = shift;

替代地

我选择在这里传递一个打开的文件句柄作为参数,然后计算线条,只需通过逐行读取文件并返回行数。

有很多方法可以从文件中获取行数,作为参考: http://www.perlmonks.org/?node_id=538824

主程序看起来像这样:

#!/usr/bin/perl

use v5.14;
use strict;
use warnings;
use Countsample;

open (my $fd, "<", "text1.txt");
say line_count($fd);
close($fd);

有关打开可用且可取的文件的方法,请参阅http://perldoc.perl.org/functions/open.html

答案 1 :(得分:1)

你真的需要处理你的问题。你没有给我们足够的继续。你需要告诉我们:

  • 你想要做什么
  • 你到底做了什么
  • 您正在看到的预期行为(包括任何错误消息)

让我们逐步解决您的一些错误。

首先,当我运行你的程序时,我得到了它。

$ ./Count1.pl
bash: ./Count1.pl: usr/bin/perl: bad interpreter: No such file or directory

好的,这只是一个愚蠢的错字。但是因为你还没有解释你遇到了什么问题,我们不知道你所看到的问题是否存在,或者你是否在发布问题时引入了错字

但它很容易解决。 shebang线需要#!/usr/bin/perl。我很确定你在上一个问题中有完全相同的拼写错误!

现在运行代码会发生什么。

$ ./Count1.pl
Can't locate Countsample.pm in @INC (you may need to install the Countsample module) (@INC contains: ...)

这是因为您的软件包与模块文件的名称不同。为什么要这么做?这只会让你的生活变得复杂。

好的,让我们修复use声明,以便它正在寻找正确的事情 - use Count

现在我得到了一个不同的错误。

$ ./Count1.pl
Undefined subroutine &main::line_count called at ./Count1.pl line 5.

这将有点难以追查。因此,为了让我的生活更轻松,我会在两个文件中启用use strictuse warnings

我现在知道了:

$ ./Count1.pl
Global symbol "$line" requires explicit package name at ./Count1.pl line 9.
Execution of ./Count1.pl aborted due to compilation errors.

这意味着我需要在某个时候声明变量$line,以便我在my $line行之后添加use Count

现在我明白了:

$ ./Count1.pl
Name "main::FH" used only once: possible typo at ./Count1.pl line 8.
Undefined subroutine &main::line_count called at ./Count1.pl line 9.

在这一点上,我害怕,我厌倦了挖掘。如果你向我们提供了这个版本的代码,那么我可能还有一些精力从这里开始调查。但是因为我花了十分钟找到愚蠢的错别字并修复了无意义的错误,所以我已经失去了所有的热情。

认识到这里的人都是志愿者是很重要的。我们很乐意帮助您解决问题,但您需要自己完成一些工作。你需要确保我们不会浪费时间来修复你自己可能发现的明显事物。在解释问题所在的时候,你需要比你到目前为止更加清晰。

这是我所拥有的代码版本。也许其他人会有热情将它带到下一阶段。

Count.pm

package Countsample;

use strict;
use warnings;
use base "Exporter";
use 5.010;

our @EXPORT = qw/line_count/;

sub line_count {
  my $line = @_;
  return $line;
}

1;

Count1.pl

#!/usr/bin/perl

use strict;
use warnings;

use Count;
my $line;
open FH,"text1.txt";
line_count();
print "$line\n";

更新:&#34;未定义的子程序&#34;错误是因为我忘了在Count.pm中更改包的名称。完成后我现在得到:

$ ./Count1.pl 
Name "main::FH" used only once: possible typo at ./Count1.pl line 8.
Use of uninitialized value $line in concatenation (.) or string at ./Count1.pl line 10.

您真正需要开始思考模块的工作原理。你需要什么子程序?他们采取什么参数?他们回来了什么?