帮助从perl模块调用子程序并打印到日志文件
我不知道如何从perl模块中声明的sub调用另一个子例程。子例程只是获取日期信息 我打开了一个日志文件的文件句柄,我想将一些日期信息打印到这个日志文件中,但它没有打印出来。我可以看到它触及了文件,我也制作了日志文件-rwx 下面是我正在调用的perl(Test.pm)模块中的示例子程序:帮助从perl模块调用子程序并打印到日志文件,perl,Perl,我不知道如何从perl模块中声明的sub调用另一个子例程。子例程只是获取日期信息 我打开了一个日志文件的文件句柄,我想将一些日期信息打印到这个日志文件中,但它没有打印出来。我可以看到它触及了文件,我也制作了日志文件-rwx 下面是我正在调用的perl(Test.pm)模块中的示例子程序: sub spGetCurDateTime { my ($sec, $min, $hour, $mday, $mon, $year) = localtime(); my $currentDateT
sub spGetCurDateTime {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
my $currentDateTime = sprintf "%4d-%02d-%02d %02d:%02d:%02d",
$year+1900, $mon+1, $mday, $hour, $min, $sec;
return $curDateTime;
}
这是我的测试代码的一部分,我试图从中调用子例程(test.pm)
使用Test.pm;
#创建日志
打开(LOG,“>/home/dev/test.LOG”)| | die“无法追加”;
潜艇警报{
未定义$/;
打开(my$QFH,“”,&spGetCurDateTime,“\n”;
我的$sth=$dbh->prepare()||
die(“无法连接到数据库:”..DBI::errstr。“\n”);
$sth->execute;
收盘价$QFH;
my$row=$sth->fetchrow\u hashref;
$sth->finish;
返回$row->{RESULT};
打印$row;
}
阅读《每日邮报》。您需要将函数作为导出符号,完全限定它,或专门导入它…阅读man perlmod。您需要将函数作为导出符号放置,完全限定它,或者专门导入它…首先,除非您知道为什么需要magic behavior,否则不要说&functionname
。一般来说,在Perl 5中,函数调用看起来像functionname()
或functionname
,这取决于您希望它被视为一个术语(即最高优先级)还是一个运算符(当您刚开始时,只需始终使用functionname()
表单就更容易了,因为这将满足您的期望)
你可以说
print LOG "Checking on status time =>", Test::spGetCurDateTime(), "\n";
但这可能会过时,因此大多数人使用该模块将某些函数和变量导出到名称空间中,该名称空间表示use Test代码>。您可能还希望避免使用模块名Test
,因为已经存在一个
在文件T.pm中:
package T;
use strict;
use warnings;
use Exporter qw/import/;
our @EXPORT_OK = qw/spGetCurDateTime/;
sub spGetCurDateTime {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
my $currentDateTime = sprintf "%4d-%02d-%02d %02d:%02d:%02d",
$year+1900, $mon+1, $mday, $hour, $min, $sec;
return $currentDateTime;
}
1;
在文件t.pl中:
#!/usr/bin/perl
use strict;
use warnings;
use T qw/spGetCurDateTime/;
print spGetCurDateTime(), "\n";
首先,永远不要说&functionname
,除非你知道为什么你可能想要神奇的行为。一般来说,在Perl 5中,函数调用看起来像functionname()
或functionname
,这取决于您希望它被视为一个术语(即最高优先级)还是一个运算符(当您刚开始时,只需始终使用functionname()
表单就更容易了,因为这将满足您的期望)
你可以说
print LOG "Checking on status time =>", Test::spGetCurDateTime(), "\n";
但这可能会过时,因此大多数人使用该模块将某些函数和变量导出到名称空间中,该名称空间表示use Test代码>。您可能还希望避免使用模块名Test
,因为已经存在一个
在文件T.pm中:
package T;
use strict;
use warnings;
use Exporter qw/import/;
our @EXPORT_OK = qw/spGetCurDateTime/;
sub spGetCurDateTime {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
my $currentDateTime = sprintf "%4d-%02d-%02d %02d:%02d:%02d",
$year+1900, $mon+1, $mday, $hour, $min, $sec;
return $currentDateTime;
}
1;
在文件t.pl中:
#!/usr/bin/perl
use strict;
use warnings;
use T qw/spGetCurDateTime/;
print spGetCurDateTime(), "\n";
许多用户不了解Perl的一个方面是名称空间
如果不处理名称空间,像Perl模块存档这样的事情将是不可能的,因为每个模块都必须确保没有其他模块具有任何其他模块具有的子例程和变量名
按照编写Perl的标准方式,每个Perl模块都有自己的名称空间。这样,变量名和函数就不会与您在程序中定义的变量和函数发生冲突
查看您的测试模块,看看是否有一行:
package Test;
在程序的顶部。如果是,则表示模块中的每个变量和每个子例程都在Test
的命名空间中,而不是main
命名空间(默认命名空间)中。该命令更改名称空间,直到下一个包命令
如果(如我们所怀疑的)Test.pm模块具有包
命令,则需要将spGetCurDateTime
子例程作为Test::spGetCurDateTime
引用
正如已经指出的,您可以使用将变量和函数名导入当前名称空间
在您的主程序中:
use Test;
use Test qw(spGetCurDateTime);
将自动导入spGetCurDateTime和日志子例程,您只需将它们用作spGetCurDateTime()
和log,而不是Test::spGetCurDateTime和Test::log`
但是,现在不鼓励默认导入所有子例程和变量,因为它会在没有警告的情况下干扰用户自己的程序。在上面的示例中,我不仅导入了log
函数,还重写了内置于Perl中的log
函数(log
取一个数字的自然对数)
更好的方法是使用EXPORT\u OK
并让用户选择要导入的函数:
package Test;
use base qw(Exporter);
our @EXPORT_OK qw(spGetCurDateTime log);
sub spGetCurDateTime {
};
在您的主程序中:
use Test;
use Test qw(spGetCurDateTime);
现在,您可以执行spGetCurDateTime()
而不是Test::spGetCurDateTime
,但是您没有在未实现的情况下覆盖log
。您仍然可以说Test::log
来执行模块中的log
子例程。许多用户不了解Perl的一个方面是名称空间
如果不处理名称空间,像Perl模块存档这样的事情将是不可能的,因为每个模块都必须确保没有其他模块具有任何其他模块具有的子例程和变量名
按照编写Perl的标准方式,每个Perl模块都有自己的名称空间。这样,变量名和函数就不会与您在程序中定义的变量和函数发生冲突
查看您的测试模块,看看是否有一行:
package Test;
在程序的顶部。如果是,则表示模块中的每个变量和每个子例程都在Test
的命名空间中,而不是main
命名空间(默认命名空间)中。该命令更改名称空间,直到下一个包命令
如果(如我们所怀疑的)您的Test.pm模块具有