0

我是 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+ 子程序。因此,要将每个子程序中的命令写入日志文件,我必须编写 print LOG "[Command]\n"; 效果很好,但脚本长度很大。那么使用通用子程序是他们实现这一目标的任何方式吗?

4

2 回答 2

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.

于 2013-07-12T10:09:54.090 回答
3

一些提示:

  • 始终在脚本顶部添加use strict;和。use warnings;
  • 由于您正在处理读取和写入文件,因此您还应该添加use autodie;. 如果您无法打开文件或无法写入打开的文件,这将自动终止您的程序。
  • 当 Perl 可能无需调用 OS 命令就可以完全按照您的意愿行事时,请不要使用 OS 命令。
  • 子例程通常接受参数并返回某种值。在您的情况下,让您的test子例程返回一些内容以写入日志。或者,只创建一个写入日志的日志子例程,并让您的测试子例程调用它。

在这里,我正在反转您的子例程调用。我创建了一个write_to_log子程序来处理我的子程序调用。我write_to_log添加日期/时间戳并写下我的信息。我的各种子程序现在只需要write_to_log我。

请注意,我的所有子例程都返回某种值。该say命令(以及print)在成功时返回非零值,0在失败时返回 a。我可以用它来测试我对子程序的调用是否有效。

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,请使用其中一本书。

于 2013-07-12T15:35:38.010 回答