从我读过的关于使用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中删除该行,我没有错误.这种情况存在于几个但不是所有模块中.
显然有很多代码我没有展示,但我很困惑,我没有展示的任何代码可能会影响我在这里展示的包/使用结构.
内置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模块动态获取函数名称(作为字符串)或函数引用的列表.这将包括可能具有或不具有的模块,例如@EXPORT_OK其命名空间中的全局数组.这样的壮举有可能吗?如果是这样的话怎么把它拉下来?
编辑:从阅读perlmod,我看到它%Some::Module::作为符号表Some::Module.这是正确的地方吗?如果是这样,我怎样才能将表格缩小到只有函数名称Some::Module?
有Perl模块名称,如Moose和MooseX或DBI和DBIx或Catalyst和CatalystX或Mojo和MojoX或PPI和PPIx等.
X后缀是什么意思?
我在perl模块中经常遇到过这一行,但我无法弄清楚这究竟意味着什么.
my ($self, %myInputs) = @_;
Run Code Online (Sandbox Code Playgroud)
请向我解释声明,以便我可以继续.
我编写了一个Perl脚本,我只是想把它给每个人,因为我计划编写一个bash脚本,用于测试用户的环境并查找该环境是否能够运行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) 好的一些规则:
现在,我们已经解决了这个问题......
我已经安装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脚本,其中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) 我正在阅读O'Reilly的Perl对象,参考和模块,更具体地说是关于模块的部分.它声明在使用时use Some::Module您可以指定导入列表.从它的解释看来,使用这个列表的唯一好处是为了保持命名空间的清洁.换句话说,如果包中有子程序some_sub,main并且加载的模块有一个同名的子程序,则子程序将被覆盖.但是,如果您指定导入列表并some_sub从此列表中省略,则不会发生此冲突.然后,您可以仍然some_sub从模块通过声明它像这样运行:Some::Module::some_sub.
除了上面描述的那个之外还有其他好处吗?我问这个是因为在某些情况下你加载了具有大量功能的模块,即使你只对它的一些方法感兴趣.起初我认为通过指定一个导入列表,你只加载那些方法,而不是用你不会使用的方法来膨胀内存.但是,从上面的解释看来并非如此.您是否可以通过仅加载模块的部分来有选择地节省资源?或者Perl是否足够智能,在编译时无需程序员干预?