我希望创建自己的模块,我想使用该模块名称进一步使用。主要概念是:创建一个模块,其中应包含行计数,字数和字符数的子程序,在主程序中我应该使用该模块,我应该读取文件,输出应该显示总行数,总数该文件中的单词数和总字符数。
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
格式保存。
我认为这些信息足以创建,如果您需要任何进一步的信息,请告诉我。
请帮我完成这项任务。
答案 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 strict
和use 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 strict
和use 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.
您真正需要开始思考模块的工作原理。你需要什么子程序?他们采取什么参数?他们回来了什么?