Regex 为什么不是';这不是关于翻译文本的perl程序吗?

Regex 为什么不是';这不是关于翻译文本的perl程序吗?,regex,perl,Regex,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; #/usr/bin/perl 打开(LEET,“LEET.txt”)或死亡“无法打开LEET.txt:$!\n”; 而($li

我对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;
#/usr/bin/perl
打开(LEET,“LEET.txt”)或死亡“无法打开LEET.txt:$!\n”;
而($line=){
$line=~s/4/a/gi、s/3/e/gi;
}
打印$行;
为什么他的指纹什么都没有?我想制作一个leet speak翻译器,打开一个文本文件并打印出翻译后的文本。

您只打印最后一行。尝试将
打印
移动到循环中:

while($line = <LEET>) {
    $line =~ s/4/a/gi;
    $line =~ s/3/e/gi;
    print $line;
}
这里有一种方法(leet to english)。您可以根据需要添加更多键。要将英语翻译成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;
}
使用严格;
使用警告;
我的%leet=('4'=>a','3'=>e');
my$rx=加入“|”,键%leet;
而(){
s/($b)/$l{$1}/eg;
印刷品;
}

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

我把它放在里面,它只打印文件中写的标准文本,没有用4s和es代替3s。也许你想用
s/a/4/gi
,你的问题不清楚你是用哪种方式翻译的。而且,你不能像你所展示的那样做两次替换。我已经更新了我的答案。啊,我明白了!你说得对,我指的是s/a/4/gi。谢谢你,先生!您刚刚向我展示了regexpr在perl中的工作原理(我假设regexpr在语法上是相当通用的)实际上,当
$line
为false时,OP正在打印最后一行之后的行。
use strict;
use warnings;

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