在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

我不熟悉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+个子程序。因此,要将每个子例程中的命令写入日志文件,我必须写入打印日志“[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
    子例程来处理我的子例程调用。My
    write_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。)