自编Perl模块的模块位置

时间:2017-05-13 11:38:05

标签: perl module

我正在尝试在脚本中使用我的模块。

我知道您必须提供模块位置,并希望在脚本中提供路径。但是,我收到错误消息:

  

没有这样的文件或目录

这是我的剧本:

use strict;
use warnings;
use lib "C:/Users/XPS13/Documents/Uni/UEProgramming";

use Bioinformatics;

my $DNAinput = "restriction_test.txt";

open (my $FH_DNA_in, "<", $DNAinput) or die " Can't open file $DNAinput: $!\n";

print "Pattern match for input file \n";
print (Bioinformatics::Pattern($FH_DNA_in), "\n"); #  applying module function  

这是我的模块

package Bioinformatics; # making module, 1st line contains name

use strict; # module uses strict and warnings 
use warnings;

sub Pattern {
my $count = "0";
my ($DNAinput) = @_;
open (my $FH_DNA_in, "<", $DNAinput) or die " Can't open file $DNAinput: $!\n";
    while (my $line = <$FH_DNA_in>) {
        if ($line =~ /[AG]GATC[TC]/ ) { 
        ++ $count;
        }
}
    print "Your sequence contains the pattern [AG]GATC[TC] $count times\n";
}

    1; # last line 

答案:

模块位置有效。

发生错误是因为我打开了两次文件(在脚本和模块中)

仅在模块内打开时,它才有效。更新的脚本是:

use strict;
use warnings;

use lib "C:/Users/XPS13/Documents/Uni/UEProgramming";

use Bioinformatics;

my $DNAinput = "restriction_test.txt";

print "Pattern match for input file \n";
print (Bioinformatics::Pattern($DNAinput), "\n"); #  applying module function  

1 个答案:

答案 0 :(得分:0)

错误消息来自您函数内部的open。在您的脚本中,您打开一个名为$FH_DNA_in的文件句柄,然后将该文件句柄变量传递给您的函数

#        V
open (my $FH_DNA_in, "<", $DNAinput) or die " Can't open file $DNAinput: $!\n";
#                              V
print (Bioinformatics::Pattern($FH_DNA_in), "\n"); #  applying module function

在函数中,您将其用作要打开的文件的路径。

sub Pattern {
    my $count = "0";
    my ($DNAinput) = @_; # first arg was the filehandle!

    #                           | this is the old filehandle
    #        V different var    V
    open (my $FH_DNA_in, "<", $DNAinput) or die " Can't open file $DNAinput: $!\n";

该函数中的$FH_DNA_in是一个新的词法变量。它与旧的文件句柄无关,最终在$DNAinput中,因为这是你作为第一个(也是唯一的)参数传递的。

如果您使用文件句柄所在的路径,Perl将序列化它。看起来像这样:

$ perl -E "open my $fh, '>', 'tmp'; say $fh;"
GLOB(0x26ba8c)

因此它试图查找具有该名称的文件,这当然不存在。

您应该看到一条完整的错误消息,如下所示:

  

无法打开文件GLOB(0x26ba8c):没有这样的文件或目录

请注意,由于您在\n的参数中包含换行符die,因此不会告诉您错误发生在哪一行。如果你还没有这样做,那么装载模块会更加明显,因为消息更像是

  

无法打开文件GLOB(0x26ba8c):C:/Users/XPS13/Documents/Uni/UEProgramming/Bioinformatics.pm第9行没有此类文件或目录。