2015-06-23 40 views
2

所以我的目標是找到一種簡單的方法來打開Perl中的打印語句的標誌。在C/C++中,可以使用#define來選擇是否運行某些代碼,這是打開和關閉調試打印語句的一種方式。如果定義了#define DEBUG,那麼你打印一些東西,否則你在沒有打印語句的情況下運行它。我想知道是否有一種簡單的方法可以在Perl中執行此操作。使用標誌進行Perl調試

這裏是它如何工作的例子:在命令行中,你可以做兩兩件事之一

for($i = 0 ; $i < 10; $i++){ 
    if(debug flag){ 
     print some info; 
    } 
    do operational stuff. 
} 

現在:

1.Run沒有調試打印語句

perlScript.pl 

2.使用調試打印語句運行

perlScript.pl -debug 

或者如果有人有更好的主意,請讓我知道!

+2

你也可以考慮使用一個環境變量:'DEBUG = 1 perl perlScript.pl'。然後你可以檢查DEBUG環境變量('$ ENV {DEBUG}')並作出相應的反應。 –

+2

不改變你的代碼,但可能會給你太多的信息:https://metacpan.org/pod/Devel::DumpTrace – toolic

回答

2

在Perl中,編譯時也是運行時。所以使用#define類型語句確實沒有什麼優勢。

我慣用的伎倆是:

my $debug = 0; 
$debug += scalar grep ("-d", @ARGV); 

GetOpt可能是誠實的,雖然一個更好的計劃)

然後用:

print if $debug; 
print $statement if $debug > 2; 

這意味着我有一個簡單的方法設置詳細程度,並允許我通過增加語句對其進行選擇。

有時我會嵌入一個信號處理器也調整調試級別 -

#!/usr/bin/perl 

use strict; 
use warnings; 

my $debug = 0; 
$debug += scalar grep ("-d", @ARGV); 

$SIG{'USR1'} = { $debug++ }; 
$SIG{'USR2'} = { $debug-- }; 

while (1) { 
    print "Debugging at: $debug\n"; 
    sleep 1; 
} 

它更多什麼樣的代碼,我寫的問題 - 後者做forkŸ東西時,我特別喜歡,因爲那樣我就可以獨立地調整每個分支中的調試級別。

+0

完美!正是我想要的! – user1334858

+0

所以我使用GetOptions作爲我的命令選項。如果他們放入'-debug'標誌,有沒有辦法讓'$ debug = 1'。因爲現在我首先設置'$ debug = 0'然後我執行'GetOptions(debug = i => $ debug)'。問題是如果他們只是'調試'然後'$調試'仍然設置爲0 ....但我希望它設置爲1,如果他們不包括一個詳細的設置。 – user1334858

1

與您的想法類似,但更簡潔,並轉到stderr,並假設您使用類似Getopt :: Long的設置調試CLI選項。

warn "debug info:..." if ($debug); 
+0

問題是關於如何設置'$ debug'首先 – Borodin

1

我通常使用以下樣板文件通過Log::Log4perl登錄腳本。您可以從命令行覆蓋logbase/log配置位置(或者更通常地,在部署時將適當的位置設置爲默認位置),並且在向腳本提供一個或多個-verbose標誌時,覆蓋該日誌記錄並登錄屏幕4個verbose給你屏幕輸出。這使您可以輕鬆地從調試轉換,通過提供標記標誌來獲取每個日誌輸出,將其傳遞到自定義日誌處理程序配置以調試子系統,在生產部署中設置日誌記錄,所有這些都只需最少/無代碼更改。

use Getopt::Long; 
use Pod::Usage; 
use Log::Log4perl qw/:easy/; 

my $opts = { logconf  => undef, 
      logbase  => 'corp.team.app.appname' 
      debug   => 0, 
      }; 

GetOptions ('logconf|l=s'  => \$opts->{logconf}, 
      'logbase=s'   => \$opts->{logbase}, 
      'verbose|v+'  => \$opts->{debug}, ### debug levels - 0 = off (default), 1 = error, 2 = warn, 3 = info, 4 = debug. 
                 ### Ignored if a logconf is provided. 
      ) or pod2usage(0); 

### Initialize logging subsystem 
init_logger(); 

### Usage 
logger('app_subsystem')->info('some message...'); 
logger()->debug('debug message...'); 


### Initialize logging system 
sub init_logger { 
    ### If a log configuration is found, and debug was not set, use it 
    if (  $opts->{logconf} 
     and -e $opts->{logconf} 
     and ! $opts->{debug} 
     ) { 
     Log::Log4perl->init($opts->{logconf}); 
    } 
    ### Otherwise fall through to easy_init a screen logger based on the verboseness level 
    ### Logging off if no config found and no verboseness set 
    else { 
     my ($min, $max) = (0, 4); 
     my %levels; 
     @levels{$min .. $max} = ($OFF, $ERROR, $WARN, $INFO, $DEBUG); 
     my $log_level = $opts->{debug}; 
     if ($log_level < $min) { 
      $log_level = $min; 
     } 
     elsif ($log_level > $max) { 
      $log_level = $max; 
     } 
     Log::Log4perl->easy_init($levels{$log_level}); 
    } 
} 

### Shorthand shim sub to get a logger 
### Always returns a Log::Log4perl logger object 
sub logger { 
    my ($category) = @_; 
    if ($category) { 
     return Log::Log4perl->get_logger($opts->{logbase} . '.' . $category); 
    } 
    return Log::Log4perl->get_logger($opts->{logbase}); 
} 
-2

向上穿過V5.10,你也可以從字面上使用C預處理你的Perl腳本與-P命令行開關,在perlrun記錄。

#!perl -P 
# myScript.pl 
#define DEBUG(x) x 
$foo = 42; 
DEBUG(print "foo is $foo\n";) 

$ perl -P myScript.pl 
foo is 42 

(如-T開關,#!perl -P不會自動使用C預處理與你的劇本,但它強迫你明確地使用-P每次運行腳本時切換自己)

2

-s選項允許你指定在命令行上main包變量的值,但你必須從一個文件運行的perl程序,而不是使用-e選項

如果你有一個Perl程序

use strict; 
use warnings; 

our $debug 
print $debug, "\n"; 

,並在命令行

perl -s myprog.pl -debug 

運行它,然後該程序將打印1

注意,而不是在命令行中使用-s,您可以在家當指定它所以如果你的代碼看起來像

#!/usr/bin/perl -s 

use strict; 
use warnings; 

our $debug 
print $debug, "\n"; 

那麼你的命令行只需要包含

myprog.pl -debug 
+0

我試圖使用-s ...它不是在做你說的。我需要'嚴格使用'和'使用警告'嗎?我使用GetOptions作爲獲取-debug標誌的方式 – user1334858

+0

@ user1334858:'-debug'必須在*腳本文件名之後,*在腳本的任何參數*之前。所以如果你將'f1'和'f2'文件傳遞給你的腳本,你會寫'perl -d myscript.pl -debug f1 f2'。如果工作正常,那麼'-debug'將從'@ ARGV'中移除,'GetOptions'永遠不會看到它。您應該首先在我的程序上試試它,看看您是否可以打印出值1,然後根據您的需求進行調整。 – Borodin

+0

今天學習了關於Perl的新內容。 – mob