2013-07-12 30 views
0

我是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+子程序。所以要在每个子例程中写入命令来记录文件,我必须写print LOG“[Command] \ n”;这工作正常,但脚本长度是巨大的。那么使用普通的子程序是他们实现这一目标的方法吗?

+0

如果您对Perl脚本编程不熟悉,为什么Perl看起来如此令人难以置信的老式? – innaM

+0

也许他/她是老式的;) – m0skit0

+2

因为所有的Perl教程都没有经过很长很长的一段时间的更新。 – shawnhcorey

回答

4

您的代码有几个问题。

  1. 您确定您要(并且想要)写入/usr/bin/

  2. 你永远不会打电话给你的log()或你的test()子程序。没有人会自动调用其中的任何一个。

  3. 名称log与内置log功能冲突。所以你要么用前面的&符号&log()来称呼它,这很丑陋或者重命名它。

  4. 您的test()子只有一个隐式返回值。明确地返回$date的值。

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

+0

功能名称作为示例,您可以考虑任何名称。我想达到的不是写 print LOG“xyz”;每次,我都可以直接将子程序直接写入日志文件。 – Captain

+0

接受我的建议,将其应用于您的小脚本,并且您想实现的目标只会起作用。 – innaM

+0

(提示:2)和3)在这里是最相关的点。但请不要忽略你真正想学习Perl的人。) – innaM

2

一些提示:

  • 总是在你的脚本的顶部添加use strict;use warnings;
  • 由于您正在处理读取和写入文件,您还应该添加use autodie;。如果您无法打开文件,或者无法写入打开的文件,这会自动终止您的程序。
  • 不要使用操作系统命令时,Perl可能可以做到你想要的,而无需调用操作系统命令。
  • 子例程通常需要参数并返回某种类型的值。在你的情况下,让你的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,请使用其中一本书。

相关问题