将子例程写入perl中的日志文件

时间:2013-07-12 09:36:01

标签: 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
{
   print LOG "Writing log files\n";
   print LOG test(); # we cannot do like this :)
}

logFunc();

说他们是15个以上的子程序。所以要在每个子程序中写入命令到日志文件,我必须写入打印LOG“[Command] \ n”;哪个工作正常,但脚本长度很大。那么使用common子程序是他们实现这个目标的任何方法吗?

2 个答案:

答案 0 :(得分:4)

您的代码存在一些问题。

  1. 您确定您(并且想要)对/usr/bin/的写入权限吗?

  2. 您永远不会调用log()test()子程序。没有人会自动调用其中任何一个。

  3. 名称log与内置log功能发生冲突。因此,您必须使用前置的&符号&log()来调用它,这个符号很丑或重命名。

  4. 您的test() sub只有一个隐含的返回值。而是明确地返回$date的值。

  5. 您正在使用已弃用的2参数版本的open使用一个全字的全局文件句柄。请使用带有词法文件句柄的3-arg版本:open my $log_fh, '>>', $logfile

答案 1 :(得分:3)

一些提示:

  • 始终在脚本顶部添加use strict;use warnings;
  • 由于您正在处理读写文件,因此您还应添加use autodie;。如果您无法打开文件,或者您无法写入打开的文件,这将自动终止您的程序。
  • 当Perl可能完全按照您的意愿执行操作而不调用OS命令时,请不要使用OS命令。
  • 子程序通常接受参数并返回某种值。在您的情况下,让您的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,请使用其中一本书。