为什么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/;
答
这里有一个办法做到这一点(莱特英制)。您可以根据需要添加更多密钥。要将英文翻译为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
我把它放在里面,只打印被写入文件中的标准文本,并没有取代所有为4S和3秒钟。 – Excquis
也许你的意思是使用's/a/4/gi',从你的问题来看你的翻译方式还不清楚。另外,你不能以你所展示的方式进行两次替换。我已经更新了我的答案。 –
啊,我明白了!你是对的,我的意思是s/a/4/gi。谢谢你,先生!您刚刚向我展示了perl中正则表达式的工作原理(我假设正则表达式在语法上相当通用)。 – Excquis