2012-05-02 30 views
4

這是一個愚蠢的問題;我需要這個東西更復雜,但讓我們把它簡單:在音譯運算符中使用變量

$i = quotemeta 'A'; 
$line =~ tr/a-z/$i-Z/; 

這是一個愚蠢的替代,這應該轉向小字母大寫的人,但什麼都我試圖不工作。

好了,所以我認爲這帶來了很多困惑,真正的代碼應該是:

$line =~ tr/A-Z/F-ZA-E/;

這應該是一個Caesers Chiper algorhytm。如果你想通過固定數量的字母來改變它,這很好,但我需要一個變量,所以我可以根據需要更改它的字母數量。但我想發貨eval Thnx

P.S.另外,爲什麼不//使用範圍?

回答

4

如果你真的需要TR,你可以使用eval:

$i = quotemeta 'A' 
eval("\$line =~ tr/a-z/$i-Z/;"); 
+1

每個'eval'之後最好測試'$ @',不是? – tchrist

+0

是的,可能是一個好主意。 – happydave

4

請注意,與tr///,您只能使用文字字符,而不是變量。所以,tr/a-z/$i-Z/不起作用,你必須使用tr/a-z/A-Z/。在perldoc perlop中,您可以閱讀更多關於tr///的信息,並且還可以找到有關插值或缺少的說明。

要將字符串轉換爲大寫字母,儘管還有其他方法。您可以使用uc函數或正則表達式轉義序列\U(大寫)和\L(小寫)。例如: -

my $str = 'a'; 
my $uppercase = uc $str; 

正則表達式:

my $str = 'abcdef'; 
$str =~ s/([a-z]+)/\U$1/; # $str is now 'ABCDEF' 

tchrist指出[a-z]應被寫入\p{CWU},其中將包括被影響的情況下,所有的字符。

更新:

如果你想創建某種動態編碼功能,我建議一個子程序,它需要的參數,並手動來回移動的字符。

sub foo { 
    my ($str, $num) = @_; # num is how many characters to shift the alphabet 
    my @in = 'A' .. 'Z'; 
    my @out = @in[$num .. $#in, 0 .. $num-1]; 
    my %out = map { $in[$_] => $out[$_] } 0 .. $#in; 
    $str =~ s#(.)# $out{$1} // $1 #eg; # if key does not exist, use org 
    return $str; 
} 

請注意,它是區分大小寫的,但您可以添加小寫字母以解決該問題。

+0

此外,你很*應*使用'uc'大寫,'ucfirst'爲titlecase,'lc'代表小寫字母,或者v5.16的'fc'代表摺疊盒。永遠不要做壞的破壞的ASCII方式。 – tchrist

+0

@tchrist這是哪種方式?逃逸序列?爲什麼這會破裂? – TLP

+0

你會恨我的,但你真的是指'你知道'$ str =〜s /(\ p {CWU} +)/ \ U $ 1/g'。看到'[a-z]'在後ASCII時代確實是一種反模式。 – tchrist

0

tr不適用於變量;改用s ///(替代)。

+0

你會如何建議這樣的替代看起來像範圍'a-z'?這不是一個答案。 – TLP

+0

是的,我不能有一個範圍與s /// 是否有任何其他函數有範圍,而不是tr和s – Zippie

+0

你*可以*使用範圍。就像我在答案中所展示的一樣。我的觀點是,Kenosis沒有用'\ U'來指定它的完成方式。 – TLP

2

你的例子不幸是不好的; tr運算符不接受任何可變插值(在任何一半中)。如果您實際使用的是tr,那麼除非您使用eval,否則您的運氣並不好,這是不推薦的。如果您沒有使用tr,那麼請向我們展示實際的代碼,以便我們可以看到發生了什麼並提供更多建議。

UPDATE

這個怎麼樣?

my %map; 
@map{'A'..'Z'} = ('F'..'Z','A'..'E'); 
s/[A-Z]/$map{$&}/g; 

不知道它是否仍然是真實的,但一旦在不惜一切代價避免時間$&是由於一個可怕的性能損失。你可以這樣做很容易就夠了:

s/([A-Z])/$map{$1}/g; 
+3

停止。對於這個目的,使用'eval'沒有任何不推薦的地方。嘖。 – tchrist

+0

我編輯了這個問題,所以它可以更清晰 – Zippie

+0

@tchrist除了它可能是矯枉過正。我會爭辯說,最好學習正確的技術,而不是依靠eval來破解事情。 – TLP

相關問題