为什么perl不打印关于翻译文本的内容?

问题描述:

我是新来的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,打开一个文本文件并打印出翻译后的文本。

您只在打印上一个一行。尝试移动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

这里有一个办法做到这一点(莱特英制)。您可以根据需要添加更多密钥。要将英文翻译为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