【问题标题】:How to install package modules(manually) in activeperl [duplicate]如何在activeperl中安装包模块(手动)[重复]
【发布时间】:2019-11-01 04:34:10
【问题描述】:

我正在使用 oops 概念中的 perl 示例。我无法安装 perl 包模块。

此文件与 student.pm 一起保存

 package Student;
 require Exporter;
 use vars qw(@ISA @EXPORT);
 @ISA = qw(Exporter);
 our @EXPORT =('new'); 
 sub new   
 {  
     my $class = shift;  
     my $self = {  
         _name => shift,  
         _rank  => shift,     
     };  

     print "Student's name is $self->{_name}\n";  
     print "Student's rank is $self->{_rank}\n";  

     bless $self, $class;  
     return $self;  
 }  

 1;  

这个文件是用 person.pl 保存的

  use Student; 
  $object = new Student( "Ram", "3th");  

我收到这样的错误消息 在@INC 中找不到Student.pm(您可能需要安装Student 模块)(@INC 包含:C:/Perl64/site/lib C:/Perl64/lib)........

【问题讨论】:

  • 尝试在模块搜索路径中包含当前目录:use lib '.'。另见Doesn't Perl include current directory in @INC by default?
  • @HåkonHægland:您应该将其扩展为答案。我敢打赌这是正确的解决方案。
  • @Håkon Hægland,您应该阅读您链接的页面,因为它解释了 use lib '.'; 是错误的。

标签: perl


【解决方案1】:

要加载当前目录中的模块,请将当前目录添加到模块搜索路径@INC

use strict;
use warnings;
use FindBin qw( $RealBin );  # The script's directory.
use lib $RealBin;            # Look for modules there.
use Student; 
my $object = Student->new( "Ram", "3th");

另请注意,模块名称应为Student.pm 而不是student.pm。案例很重要。

 package Student;
 use Exporter qw(import);
 our @EXPORT = qw(); 
 sub new   {  
     my $class = shift;  
     my $self = {  
         _name => shift,  
         _rank  => shift,     
     };  

     print "Student's name is $self->{_name}\n";  
     print "Student's rank is $self->{_rank}\n";  

     bless $self, $class;  
     return $self;  
 }  

 1;  

注意事项

  • new Student 是实例化对象的旧方法(使用所谓的间接对象表示法)。现在推荐的方式是Student->new(...)

  • our @EXPORT =('new'):您不需要导出new,这样做通常是错误的。由于对象创建应由模块名称限定,因此导出new 没有意义。

  • require Exporter; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); 是旧样式。最好写use Exporter qw(import)

【讨论】:

  • 关于“大小写很重要。”,从技术上讲,use Student; + package Student; + 'student.pm` 将在不区分大小写的文件系统上工作。但我同意文件应该命名为Student.pm,即使它不是必需的。
  • 如果两个文件在不同的目录下,是否需要对上述程序进行任何更改。
  • @Ekanvitha 是的,例如,如果 Student.pm 位于相对于 person.pl 的目录 lib 中,则需要 use lib "${RealBin}/lib"
  • 我已将 student.pm 保存在 D:\Ekanvitha\modules 中,将 Student.pl 保存在 D:\Ekanvitha\perl 中。我已经像这样添加了 use lib " ${RealBin}\Ekanvitha\modules";错误显示为在 D:\Ekanvitha\perl\student.pl 第 6 行无用使用 \E。无法识别的转义 \m 在 D:\Ekanvitha\perl\student.pl 第 6 行通过。全局符号“$RealBin”需要在 D:\Ekanvitha\perl\student.pl 第 6 行的显式包名称(您是否忘记声明“my $RealBin”?)。错误后 BEGIN 不安全——编译在 D:\Ekanvitha\perl\student.pl 中止第 6 行。
  • @Ekanvitha 如果在路径中使用反斜杠,则需要转义它们。或者,您可以尝试use lib ($RealBin . '\..\modules');,因为单引号不会解释反斜杠转义序列
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多