2013-07-12 60 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,請使用其中一本書。

相關問題