2013-10-21 16 views
-1

我正在寫perl腳本來找出一些代碼中未使用的變量。 我能夠得到整個函數體和這個函數中所有變量的名字。Perl與正則表達式和變量計數

我現在想要計算函數體內每個變量的外觀(如果它只出現1,這是未使用的變量,否則就沒關係)。

刪除函數體的註釋以避免錯誤計數。

foreach my $var (@vars) {     # @vars is an array of all variables name 
              # $fun_body is function body (string) 
    my $count = $fun_body =~ tr/\Q$var//; # this line is tricky and does not work 
    print $count." : ".$var."\n"; 
} 

分辯現在我就從我的腳本一些無用的信息:

1046 : v_result 
1046 : v_LastValue 
1046 : v_LastValue_2 

它看起來像腳本不使用變量作爲輸入正則表達式,但使用$var爲字符串。優化不是我要做的,或者當腳本能夠正常工作時(代碼解析相對較小,它具有100k-500k行),我會去做。

我的問題是: 有any1有一個想法如何計數與正則表達式使用變量?

+3

'tr'不使用正則表達式。 – toolic

回答

2

perlfaq4(我怎麼能算一個字符串中的子串出現的次數):

這是好的,如果你只是尋找一個字符。但是,如果您要在 較大的字符串內計數多個字符子串,則 tr /不可用。

use warnings; 
use strict; 

my $fun_body = 'foo bar baz foo goo hoo'; 
my @vars = qw(foo bar); 
for my $var (@vars) { 
    $var = quotemeta $var; 
    my $count =() = $fun_body =~ /\b$var\b/g; 
    print "$var: $count\n"; 
} 

__END__ 

foo: 2 
bar: 1 
+0

你沒有考慮到他的變量會有'''',這是一個正則表達式中的元字符。因此,你不是逃避它。這不適用於OP。 – simbabque

+0

OP沒有指定正在分析哪種語言。如果是'C',則沒有標識。你應該把這作爲OP的問題。 – toolic

+0

沒錯,但他在代碼中使用了'\ Q',這表明他意識到可能會發生。 – simbabque

1

B::Xref模塊會告訴你所有你能關於節目內標識定義和使用需要的信息。

使用它像

perl -MO=Xref myprog.pl