[英]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;
我還用Exporter的import
方法替換了@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.