在我们的产品中,我们有一个很大的实用程序文件,我们需要(带do)在很多文件的开头.有没有理由不把它变成一个模块?例如,而不是这样做:
do '../dbi_utilities.pl';
our ($db,$user,$pw,$attr);
my $Data = DBI->connect($db,$user,$pw,$attr) or die "Could not connect to database: $DBI::errstr";
Run Code Online (Sandbox Code Playgroud)
我不能这样做吗?:
use AppUtil;
my $Data = AppUtil->connect();
Run Code Online (Sandbox Code Playgroud) 我想使用gmail的smtp服务器和perl发送电子邮件.我正在尝试安装Email::Send::Gmail,但我不清楚安装它的步骤是什么.它似乎取决于我没有安装的其他模块.
我编写了一个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) 我可以使用以下代码从Nagios-Report Perl模块打印出Host UP Time百分比:
#!/usr/bin/perl
use strict ;
use Nagios::Report ;
my $x = Nagios::Report->new(q<local_cgi localhost nagiosadmin>)
or die "Can't construct Nagios::Report object." ;
$x->mkreport(
[ qw(HOST_NAME PERCENT_TOTAL_TIME_UP) ],
sub {
my %F = @_; my $u = $F{PERCENT_TOTAL_TIME_UP}; $u =~ s/%//;
},
0,
sub {
my $F = shift @_ ;
}
) ;
$x->debug_dump ;
Run Code Online (Sandbox Code Playgroud)
但是,我怎样才能打印出服务时间百分比?我的意思是只输出百分比值.
我尝试了很多选择,但无法做到正确.
如果我有一个有方法的模块a,并b与要导出他们我做的:
use Exporter;
our @ISA = qw (Exporter);
our @EXPORT = qw (a b);
Run Code Online (Sandbox Code Playgroud)
我不明白的是这一行:
our @ISA = qw (Exporter);做什么?
我正在阅读O'Reilly的Perl对象,参考和模块,更具体地说是关于模块的部分.它声明在使用时use Some::Module您可以指定导入列表.从它的解释看来,使用这个列表的唯一好处是为了保持命名空间的清洁.换句话说,如果包中有子程序some_sub,main并且加载的模块有一个同名的子程序,则子程序将被覆盖.但是,如果您指定导入列表并some_sub从此列表中省略,则不会发生此冲突.然后,您可以仍然some_sub从模块通过声明它像这样运行:Some::Module::some_sub.
除了上面描述的那个之外还有其他好处吗?我问这个是因为在某些情况下你加载了具有大量功能的模块,即使你只对它的一些方法感兴趣.起初我认为通过指定一个导入列表,你只加载那些方法,而不是用你不会使用的方法来膨胀内存.但是,从上面的解释看来并非如此.您是否可以通过仅加载模块的部分来有选择地节省资源?或者Perl是否足够智能,在编译时无需程序员干预?
我正在编写一个Perl模块,它涉及一些非常复杂的正则表达式,如果没有工具来帮助我几乎无法调试.我认为该Regexp::Debugger模块将是完成该工作的完美工具,但它似乎只能在.pl脚本中工作,并且似乎不能在.pm模块中工作.
例如,这有效:
test.pl
use strict;
use warnings;
use Regexp::Debugger;
my $text = "text";
if ($text =~ /tex/) {
print "Match!";
}
Run Code Online (Sandbox Code Playgroud)
我得到了预期的调试功能.
但第二个我介绍了一个Perl模块,它不再起作用:
test.pl
use strict;
use warnings;
use TestModule;
TestModule::func();
Run Code Online (Sandbox Code Playgroud)
TestModule.pm
package TestModule;
use strict;
use warnings;
use Regexp::Debugger;
sub func {
my $text = "text";
if ($text =~ /tex/) {
print "Match!";
}
}
1;
Run Code Online (Sandbox Code Playgroud)
尝试运行此代码会出现以下错误:
不能在Regexp/Debugger.pm第160行使用未定义的值作为HASH参考
简单地包含Regexp::Debugger在"test.pl"文件中也不起作用,因为它不会尝试在包含的模块中调试正则表达式.
我怎样才能使这个工作,所以我可以调试我正在工作的模块中的正则表达式?
已提交错误报告,现在CPAN上的新版本(v0.002001)可按预期工作.:)