簡體   English   中英

Perl 模塊的創建和使用 - 未定義的子程序

[英]Perl Module Creation & Usage - Undefined subroutine

我正在嘗試在我正在做的新腳本中創建和使用模塊,但我還不熟悉模塊。 我一直在關注一些教程,即使我有與教程中“幾乎”完全相同的代碼,它也不起作用,當我運行我的測試腳本時,我收到以下錯誤:

Undefined subroutine &main::func1 called at ../../bin/fftg.pl line 21.

這是我的主要腳本:

#!/usr/bin/perl
# ......
# comments here
# ......
use strict;
use warnings;

use File::Basename qw(dirname);
use Cwd  qw(abs_path);
use lib dirname(dirname abs_path $0) . '/lib';

use FFTG::PID qw(:DEFAULT);

print func1(10,20);

這是模塊,創建為文件lib/FFTG/PID.pm

package PID;

use strict;
use warnings;
use Exporter;

our $VERSION     = 1.00;
our @ISA         = qw(Exporter);
our @EXPORT      = qw(&func1 &func2);       # I tried all lines without &
our @EXPORT_OK   = qw(&func1 &func2);       # I tried all lines without &
our %EXPORT_TAGS = ( DEFAULT => [qw(&func1)],
                     Both    => [qw(&func1 &func2)]);


sub func1
{
    my ($x, $y) = @_;
    return $x + $y;

}

sub func2
{
    return "tata\n";
}

1;

請問我做錯了什么? 我嘗試使用以下方法加載東西:

use FFTG::PID qw(:DEFAULT);
use FFTG::PID;
use FFTG::PID qw(funct1);
use FFTG::PID qw(&funct1);

沒有任何效果(同樣的錯誤)

我還嘗試修改模塊,修改這些行,刪除或添加 & :

our @EXPORT      = qw(func1 func2);
our @EXPORT_OK   = qw(func1 func2);

同樣的問題

任何提示?

我的文件夾和文件是:

MIF/root@sm1p0003vmo /wminfs/mc/projects/FFTGv2: pwd
/wminfs/mc/projects/FFTGv2
MIF/root@sm1p0003vmo /wminfs/mc/projects/FFTGv2: ls -al bin/fftg.pl
-rwxr-x---   1 root     root         545 May 18 09:49 bin/fftg.pl
MIF/root@sm1p0003vmo /wminfs/mc/projects/FFTGv2: ls -al lib/FFTG/PID.pm
-rw-r-----   1 root     root         344 May 18 09:37 lib/FFTG/PID.pm
MIF/root@sm1p0003vmo /wminfs/mc/projects/FFTGv2:

感謝和問候,

有一些錯誤,還有一些可以做得更好的事情。

  • 模塊名稱需要匹配其(相對)位置,因此: package FFTG::PID;

  • 列出模塊中EXPORT的子程序時不能有& 這些應該是名稱,而&不是名稱的一部分。 使用編譯指示(我的重點)

    從命名模塊將一些語義導入當前包

  • 全大寫的名稱是一個冒險的想法,因為它們可能被采用,並且這里不能使用DEFAULT

使用@EXPORT_OK而不是@EXPORT通常是一個很好的建議。

最后,設置lib 的那行是自找麻煩。 使用FindBin

lib/FFTG/PID.pm

package FFTG::PID;

use strict;
use warnings;

use Exporter qw(import);
our $VERSION     = 1.00;
our @EXPORT_OK   = qw(func1 func2);
our %EXPORT_TAGS = ( 
    default => [ qw(func1) ], 
    both    => [ qw(func1 func2) ]
);

sub func1
{
    my ($x, $y) = @_;
    return $x + $y;       
}   

sub func2
{
    return "tata\n";
}   

1;

我還用Exporterimport方法替換了@ISA的顯式設置。

主程序

use strict;
use warnings;
use feature qw(say);

use FindBin qw($RealBin);
use lib "$RealBin/lib";

use FFTG::PID qw(:default);

say func1(10,20);

它打印一行30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM