在perl中将子例程写入日志文件
我不熟悉perl脚本。我想把子程序测试写入日志文件。 例如在perl中将子例程写入日志文件,perl,Perl,我不熟悉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
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+个子程序。因此,要将每个子例程中的命令写入日志文件,我必须写入打印日志“[Command]\n”;这很好,但脚本长度很大。因此,使用公共子例程是实现这一点的方法吗?您的代码有几个问题
/usr/bin/
的写访问权限吗log()
或test()
子例程。没有人会自动给他们打电话log
与内置的log
功能冲突。因此,您必须使用一个前置的符号和丑陋的&log()
来调用它,或者重命名它test()
sub仅具有隐式返回值。而是显式返回$date
的值open
,使用的是裸字全局文件句柄。请使用带有词法文件句柄的3-arg版本:打开我的$log\u fh,'>>,$logfile
- 始终添加
使用strict代码>和
使用警告代码>位于脚本顶部李>
- 由于您正在处理读取和写入文件,因此还应添加
使用autodie代码>。如果无法打开文件或无法写入打开的文件,这将自动终止程序
- 不要使用OS命令,因为Perl可能不需要调用OS命令就可以做您想要做的事情
- 子例程通常接受参数并返回某种类型的值。在您的情况下,让
子例程返回要写入日志的内容。或者,只创建一个写入日志的日志子例程,并让测试子例程调用它test
- 由于您正在处理读取和写入文件,因此还应添加
write\u to\u log
子例程来处理我的子例程调用。Mywrite_to_log
添加日期/时间戳并写入该日期/时间戳和我的消息。我的各种子程序现在只需为我调用write\u to\u 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";
}
下面是一个列表,列出了学习现代Perl的好书以及在这些书中要查找的内容。如果您刚开始学习Perl,请使用以下其中一本书。如果您对Perl脚本还不熟悉,为什么您的Perl看起来非常过时?也许他/她是过时的;)因为所有的Perl教程已经很久很久没有更新了。从您的示例中不清楚在“编写日志文件”之后您希望在
log.txt
中打印什么\n。你想要“Hi\n”,日期(1)的输出,还是两个,或者什么?@ PicRue:考虑有15个子程序,每个子程序都包含一些shell命令。每当执行任何子例程时,其中的命令都会写入log.txt,因此,为了将这些命令写入log.txt,我在每个子例程中都编写了打印日志“[Command]”。因此,它们的任何方式,如我可以为日志创建一个单独的子程序,每当主子程序被执行时,它将调用日志子程序,并将命令写入Log.txt,这样我就可以从每个子例程中删除所有打印语句并减少代码长度。我想要实现的是不写打印日志“xyz”;每次,我都可以直接将子例程写入日志文件。听我的建议,把它应用到你的小脚本中,你想要实现的东西就行了。(提示:2)和3)是这里最相关的要点。但请不要忽略其他人,因为他们确实想学习Perl。)