我是perl脚本编程的新手。我想把子程序测试写入日志文件。 例如。
my ($logfile, $logpath);
$logpath = '/usr/bin';
$logfile = "$logpath/log.txt";
open (LOG,">>","$logfile") || die ("Error : can't open log file");
sub test
{
print "Hi\n";
my $date = `date`;
}
sub logFunc
{
print LOG "Writing log files\n";
print LOG test(); # we cannot do like this :)
}
logFunc();
说他们是15个以上的子程序。所以要在每个子程序中写入命令到日志文件,我必须写入打印LOG“[Command] \ n”;哪个工作正常,但脚本长度很大。那么使用common子程序是他们实现这个目标的任何方法吗?
答案 0 :(得分:4)
您的代码存在一些问题。
您确定您(并且想要)对/usr/bin/
的写入权限吗?
您永远不会调用log()
或test()
子程序。没有人会自动调用其中任何一个。
名称log
与内置log
功能发生冲突。因此,您必须使用前置的&符号&log()
来调用它,这个符号很丑或重命名。
您的test()
sub只有一个隐含的返回值。而是明确地返回$date
的值。
您正在使用已弃用的2参数版本的open
使用一个全字的全局文件句柄。请使用带有词法文件句柄的3-arg版本:open my $log_fh, '>>', $logfile
。
答案 1 :(得分:3)
一些提示:
use strict;
和use warnings;
。 use autodie;
。如果您无法打开文件,或者您无法写入打开的文件,这将自动终止您的程序。test
子例程返回要写入日志的内容。或者,只创建一个写入日志的日志子例程,让测试子例程调用它。这里我正在撤消您的子程序调用。我创建了一个write_to_log
子程序来处理我的子程序调用。我的write_to_log
添加了日期/时间戳,并写下了我的消息。我的各种子程序现在只为我调用write_to_log
。
请注意我的所有子程序都返回某种值。 say
命令(以及print
)在成功时返回非零值,在失败时返回0
。我可以用它来测试我对子程序的调用是否有效。
use strict;
use warnings;
use autodie;
use features qw(say); #Allows you to use `say` instead of `print:
my $log_file = "/usr/bin/log.txt"; #You have write permission to this directory?
open my $log_fh, ">", $log_file;
my test ( $log_fh ) or die qq(Can't write to the log); #Pass the file handle to log
my test2 ( $log_fh ) or die qq(Can't write to the log);
close $log_fh;
sub test {
return write_to_log ( $log_fh, "Hello World!" );
}
sub test2 {
return write_to_log ( $log_fh, "Goodbye World!" );
}
sub write_to_log {
my $file_handle = shift;
my $message = shift;
use Time::Piece;
my $time = localtime->cdate;
return say {$file_handle} "$time: $message";
}
这是webpage,其中列出了用于学习现代Perl 的好书以及在这些书中寻找的内容。如果您开始学习Perl,请使用其中一本书。