Perl Rot47 with tr ///?

bcc*_*c32 1 string perl

我有以下代码:

#!/usr/bin/env perl

for ($str = <>; $str != '`'; $str = <>) {
    $str =~ tr/!-~/P-~!-O/;
    print $str;
}
Run Code Online (Sandbox Code Playgroud)

但ROT47无法正常工作.ie
当我使用不在[1-9]中的字符开始$ str时退出(是的,这意味着0不起作用).

eph*_*ent 8

$str != '`'
Run Code Online (Sandbox Code Playgroud)

是一个数字比较.两者"0\n""`"(以及任何不以十进制数字或点开头的字符串)在数字上都为零,因此它们是相等的.

你打算使用字符串比较ne.

(另外,总是use strict;use warnings;;后者会发现这个错误.)

一种更典型的写作方式是

while (my $str = <>) {
    last if $str =~ /^`$/;
    $str =~ tr/!-~/P-~!-O/;
    print $str;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果$ str =〜/ ^ \`$ /;`会更快,因为`最后如果$ str eq'\`';`? (2认同)