2010-08-01 83 views
2

編輯:TR ///不支持變量插值,所以我s/\Q$_\E//g;代替Perl的TR ///沒有做什麼,我想

或者,更有可能去了,我沒有做正確的事情.. 。

我有以下代碼:

#!/usr/bin/perl 

use strict; 
use warnings; 
use utf8; 

sub strip_invalid { 
    my ($str, @chars) = @_; 

    map { $str =~ tr/$_//; } @chars; 

    return $str; 
} 

my @invalid = qw(a e i o u); 

print strip_invalid("This is the super sample with vowels.\n", @invalid); 

我只是想傳遞一個字符串到strip_invalid()並有tr///通過map ......我有什麼錯刪除@invalid的人物? (順便說一句,它使用正則表達式)。

回答

7

Perl的tr功能doesn't support variables

請注意,因爲翻譯表是在編譯時生成的,所以SEARCHLIST和REPLACEMENTLIST都不受雙引號內插。這意味着,如果你想使用的變量,你必須使用一個eval():

eval "tr/$oldlist/$newlist/"; 

(Source)

4

由於tr///不允許使用變量,我會建議沿着這些線路的東西(而不是使用eval,這引起了其他問題):也

sub strip_invalid { 
    my $str = shift; 
    my $chars = quotemeta(join '', @_); 
    $str =~ s/[$chars]//g; 
    return $str; 
} 

注意tr///有一個刪除選項,所以沒有必要在所有的字符進行迭代你想刪除。例如:

$str =~ tr/aeiou//d; # Delete all vowels from $str 
2

要用tr刪除,您需要指定/ d標誌。否則,它默認基於搜索列表的替換列表(所以只是計數或壓縮)。

而tr不支持可變插值。

要使用TR,你需要做這樣的事情:

sub strip_invalid { 
    my ($str, @chars) = @_; 

    my $strip = quotemeta join '', @chars; 
    eval "\$str =~ tr/$strip//d"; 

    return $str; 
}