标签: perl-module

Perl - 包/模块问题

从我读过的关于使用Perl模块的所有内容来看,基本用法是:

  • .pm扩展名的模块文件,其中包含语句package <name>,其中<name>是没有扩展名的模块的文件名.
  • 使用模块的代码文件包含该语句use <name>;.

我正在编码的应用程序有一个主代码脚本,它使用大约5个模块.我忘记package <name>在模块中包含该语句,但我的代码仍然可以正常运行该use <name>语句.我开始收到Undefined subroutine其中一个模块的错误,所以我将package语句添加到每个模块中.现在其余的模块停止工作了.是什么赋予了?

例:

mainapp.pl

#!/usr/bin/perl
use UtyDate;
my $rowDate = CurrentDate("YYYYMMDD");
Run Code Online (Sandbox Code Playgroud)

UtyDate.pm

#!/usr/bin/perl
package UtyDate;
sub CurrentDate
{
    #logic
}
return 1;
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我收到错误Undefined subroutine &main::CurrentDate called at....但是,如果我package UtyDate;从UtyDate.pm中删除该行,我没有错误.这种情况存在于几个但不是所有模块中.

显然有很多代码我没有展示,但我很困惑,我没有展示的任何代码可能会影响我在这里展示的包/使用结构.

perl perl-module

7
推荐指数
1
解决办法
2532
查看次数

Scalar :: Util与ref函数

内置ref($object)和有Scalar::Util blessed($object)什么区别?一个比另一个更受欢迎吗?

use strict;
use warnings;

use Scalar::Util qw(blessed isvstring);

my $object = foo->new();

print "Object is a " . blessed($object) . "\n";
print "Object is a " . ref($object) . "\n";

my $version = 5.00.03;

print "Version is a " . ref(\$version) . "\n";
if (isvstring($version)) {
    print "Version is a VSTRING\n";
}

package foo;
sub new {
    my $class = shift;
    my $self = {};

    bless($self, $class);
    return $self;
}
Run Code Online (Sandbox Code Playgroud)

perl perl-module

7
推荐指数
1
解决办法
1136
查看次数

我可以从任何Perl模块动态获取函数或函数名列表吗?

我想从我的系统上可用的任意Perl模块动态获取函数名称(作为字符串)或函数引用的列表.这将包括可能具有或不具有的模块,例如@EXPORT_OK其命名空间中的全局数组.这样的壮举有可能吗?如果是这样的话怎么把它拉下来?

编辑:从阅读perlmod,我看到它%Some::Module::作为符号表Some::Module.这是正确的地方吗?如果是这样,我怎样才能将表格缩小到只有函数名称Some::Module

perl perl-module

7
推荐指数
2
解决办法
4567
查看次数

`X`后缀在名称空间中的含义是什么?

有Perl模块名称,如Moose和MooseX或DBI和DBIx或Catalyst和CatalystX或Mojo和MojoX或PPI和PPIx等.

X后缀是什么意思?

perl perl-module

7
推荐指数
1
解决办法
399
查看次数

什么是"我的($ self,%myInputs)= @_;" 意思?

我在perl模块中经常遇到过这一行,但我无法弄清楚这究竟意味着什么.

my ($self, %myInputs) = @_;
Run Code Online (Sandbox Code Playgroud)

请向我解释声明,以便我可以继续.

perl perl-module

7
推荐指数
2
解决办法
5107
查看次数

如何检查Perl的可用性,其版本和所需模块的存在?

我编写了一个Perl脚本,我只是想把它给每个人,因为我计划编写一个bash脚本,用于测试用户的环境并查找该环境是否能够运行Perl脚本.

我想测试一下这样的事情:

  1. Perl是否已安装在该系统中
  2. Perl应该有5或更高版本
  3. 模块JSON :: Any是否可用

任何建议都会非常感激:-)

bash perl perl-module

6
推荐指数
3
解决办法
2955
查看次数

使用Perl创建包

制作我的第一个简单包(我实际上是我的第一个包期)似乎有很多麻烦.我正在做我应该做的一切(我想)但它仍然无法正常工作.这是包(我想你可以称之为模块):

package MyModule;

use strict;
use Exporter;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);

$VERSION     = 1.00;
@ISA         = qw(Exporter);
@EXPORT      = ();
@EXPORT_OK   = qw(func1 func2);
%EXPORT_TAGS = ( DEFAULT => [qw(&func1)],
             Both    => [qw(&func1 &func2)]);

sub func1  { return reverse @_  }
sub func2  { return map{ uc }@_ }

1;
Run Code Online (Sandbox Code Playgroud)

我将此模块保存为MyModule(是的,它保存为.pm文件)Perl/site/lib(这是我存储的所有非内置模块的地方).然后我尝试使用这个模块的Perl脚本:

use strict;
use warnings;

my @list = qw (J u s t ~ A n o t h e r ~ P e r …
Run Code Online (Sandbox Code Playgroud)

perl module packages perl-module package

6
推荐指数
1
解决办法
1516
查看次数

Perl Cygwin好玩.模块已加载,但程序未找到

好的一些规则:

  • 不,我不能在这个系统上安装Strawberry Perl.我必须使用Cygwin.
  • 这是Perl 5.8.7.我无法更新它.
  • 这不是我的系统.这是一个客户的系统,我不能修改它到我心中的内容.

现在,我们已经解决了这个问题......

我已经安装Spreadsheet::Read,Spreadsheet::ParseExcel以及Spreadsheet::XLSX在此系统上.这安装了一个名为的Perl脚本xlscat.我们之前在开发盒和UAT盒子上做过这个.现在这是生产箱.

我收到以下错误:

Parser for XLSX is not installed at /usr/bin/xlscat line 185
Run Code Online (Sandbox Code Playgroud)

我跟踪过这个Spreadsheet::Read.相关代码是:

my @parsers = (
    [ csv       => "Text::CSV_XS"               ],
    [ csv       => "Text::CSV_PP"               ], # Version 1.05 and up
    [ csv       => "Text::CSV"                  ], # Version 1.00 and up
    [ ods       => "Spreadsheet::ReadSXC"       ],
    [ sxc       => "Spreadsheet::ReadSXC"       ],
    [ xls       => "Spreadsheet::ParseExcel"    ],
    [ xlsx      => "Spreadsheet::XLSX"          ],
    [ …
Run Code Online (Sandbox Code Playgroud)

perl cygwin perl-module

6
推荐指数
1
解决办法
2497
查看次数

Text :: CSV perl模块中的is_quoted()方法

我可能会遗漏一些明显的东西,但我有一个非常简单的perl脚本,其中Text :: CSV模块中的is_quoted()方法没有按预期工作.这是代码:

# cat ./testcsv.pl
#!/usr/bin/perl

use strict;
use Text::CSV;

my $csv = Text::CSV->new ( { quote_char => '"' } )
        or die "Cannot use CSV: ".Text::CSV->error_diag ();

print "Text::CSV version = " . $csv->version() . "\n\n";

my $line = '"text field 111",222,"text field 333",444';

my $status  = $csv->parse($line);
if ($status)
  {
  my $column_idx = 0;
  my @fields = $csv->fields ();
  foreach my $field (@fields)
     {
     my $quoted = $csv->is_quoted ($column_idx);
     $column_idx++;
     print "field #$column_idx: '$field'; quoted = " …
Run Code Online (Sandbox Code Playgroud)

csv perl perl-module

6
推荐指数
1
解决办法
374
查看次数

仅通过加载模块的一部分来节省资源?

我正在阅读O'Reilly的Perl对象,参考和模块,更具体地说是关于模块的部分.它声明在使用时use Some::Module您可以指定导入列表.从它的解释看来,使用这个列表的唯一好处是为了保持命名空间的清洁.换句话说,如果包中有子程序some_sub,main并且加载的模块有一个同名的子程序,则子程序将被覆盖.但是,如果您指定导入列表some_sub从此列表中省略,则不会发生此冲突.然后,您可以仍然some_sub从模块通过声明它像这样运行:Some::Module::some_sub.

除了上面描述的那个之外还有其他好处吗?我问这个是因为在某些情况下你加载了具有大量功能的模块,即使你只对它的一些方法感兴趣.起初我认为通过指定一个导入列表,你只加载那些方法,而不是用你不会使用的方法来膨胀内存.但是,从上面的解释看来并非如此.您是否可以通过仅加载模块的部分来有选择地节省资源?或者Perl是否足够智能,在编译时无需程序员干预?

perl perl-module

6
推荐指数
2
解决办法
128
查看次数

标签 统计

perl ×10

perl-module ×10

bash ×1

csv ×1

cygwin ×1

module ×1

package ×1

packages ×1