2011-08-18 52 views
2

我是新來的perl和一般的編程,我剛剛發現了正則表達式和替換運算符。爲什麼perl不打印關於翻譯文本的內容?

#!/usr/bin/perl 

open(LEET, "leet.txt") or die "Can't open leet.txt: $!\n"; 
while($line = <LEET>) { 
    $line =~ s/4/a/gi, s/3/e/gi; 
} 
print $line; 

他爲什麼不打印什麼?我想製作一個leet speak translator,打開一個文本文件並打印出翻譯後的文本。

回答

3

您只在打印上一個一行。嘗試移動print你的循環中:

while($line = <LEET>) { 
    $line =~ s/4/a/gi; 
    $line =~ s/3/e/gi; 
    print $line; 
} 

我也用兩個獨立的正則表達式替換,你不能在你在你的問題已經證明的方式將它們組合。

注意的Perl也有tr運營商,這是在一個步驟做兩個(單字符)替代的另一種方式:

$line =~ tr/43/ae/; 
+0

我把它放在裏面,只打印被寫入文件中的標準文本,並沒有取代所有爲4S和3秒鐘。 – Excquis

+0

也許你的意思是使用's/a/4/gi',從你的問題來看你的翻譯方式還不清楚。另外,你不能以你所展示的方式進行兩次替換。我已經更新了我的答案。 –

+0

啊,我明白了!你是對的,我的意思是s/a/4/gi。謝謝你,先生!您剛剛向我展示了perl中正則表達式的工作原理(我假設正則表達式在語法上相當通用)。 – Excquis

0

這裏有一個辦法做到這一點(萊特英制)。您可以根據需要添加更多密鑰。要將英文翻譯爲leet,只需使用反向散列:%english = reverse %leet;

也許更簡單的解決方案是使用tr///進行替換。例如。 tr/43/ae/

代碼:

use strict; 
use warnings; 

my %leet = ('4' => 'a', '3' => 'e'); 
my $rx = join '|', keys %leet; 
while (<>) { 
    s/($b)/$l{$1}/eg; 
    print; 
} 

用法:script.pl file.txt > output.txt