帮助从perl模块调用子程序并打印到日志文件

帮助从perl模块调用子程序并打印到日志文件,perl,Perl,我不知道如何从perl模块中声明的sub调用另一个子例程。子例程只是获取日期信息 我打开了一个日志文件的文件句柄,我想将一些日期信息打印到这个日志文件中,但它没有打印出来。我可以看到它触及了文件,我也制作了日志文件-rwx 下面是我正在调用的perl(Test.pm)模块中的示例子程序: sub spGetCurDateTime { my ($sec, $min, $hour, $mday, $mon, $year) = localtime(); my $currentDateT

我不知道如何从perl模块中声明的sub调用另一个子例程。子例程只是获取日期信息

我打开了一个日志文件的文件句柄,我想将一些日期信息打印到这个日志文件中,但它没有打印出来。我可以看到它触及了文件,我也制作了日志文件-rwx

下面是我正在调用的perl(Test.pm)模块中的示例子程序:

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模块具有