Perl奇数行为,在脚本声明的变量和<;STDIN>;取变量差

Perl奇数行为,在脚本声明的变量和<;STDIN>;取变量差,perl,Perl,我有这个脚本,工作正常: #!/usr/bin/perl $key = pack("H*","3cb37efae7f4f376ebbd76cd"); $str = "&4\=80CHB'"; $dec = decode($str); print "Decoded string value: $dec\n"; sub decode{ #Sub to decode @subvar=@_; my $sqlstr = $subvar[0]; $cipher = un

我有这个脚本,工作正常:

#!/usr/bin/perl

$key = pack("H*","3cb37efae7f4f376ebbd76cd");

$str = "&4\=80CHB'";
$dec = decode($str);
print "Decoded string value: $dec\n";

sub decode{ #Sub to decode
    @subvar=@_;
    my $sqlstr = $subvar[0];
    $cipher = unpack("u", $sqlstr);
    $plain = $cipher^$key;
    return substr($plain, 0, length($cipher));
}
如果我将其更改为从STDIN获取$str变量,则会将所有结果弄乱:

#!/usr/bin/perl

$key = pack("H*","3cb37efae7f4f376ebbd76cd");

print "Enter string to decode: ";
$str=<STDIN>;chomp $str;
$dec = decode($str);
print "Decoded string value: $dec\n";

sub decode{ #Sub to decode
    @subvar=@_;
    my $sqlstr = $subvar[0];
    $cipher = unpack("u", $sqlstr);
    $plain = $cipher^$key;
    return substr($plain, 0, length($cipher));
}
#/usr/bin/perl
$key=pack(“H*”,“3cb37efae7f4f376ebbd76cd”);
打印“输入要解码的字符串:”;
$str=;chomp$str;
$dec=解码($str);
打印“解码字符串值:$dec\n”;
子解码{#子解码
@subvar=@;
my$sqlstr=$subvar[0];
$cipher=unpack(“u”,$sqlstr);
$plain=$cipher^$key;
返回substr($plain,0,length($cipher));
}
第一个脚本将其设置为ok,结果是:

解码字符串值:mentos

第二个脚本不好:

解码字符串值:ot&¸ÝÖóvë½vÍ

知道我做错了什么吗?谢谢

您的原始代码

$str = "&4\=80CHB'";
由于某种原因,它包含一个转义的等号。这和

$str = "&4=80CHB'";

因此,您需要在修改后的代码中输入
&4=80CHB'

我的sting需要有“\”和其他特殊字符,如何转义它们以保持它们在从STDIN发送时不变?带有\Q…\E???@xtmtrx的内容,您的字符串不包含“\”。字符串literal
“&4\=80CHB'
生成字符串
&4=80CHB'
。如果需要字符串
&4\=80CHB'
,则需要使用文字
“&4\\=80CHB'
。可以使用单引号(或
q
运算符),如
'ABC\123'
,表示字符ABC\123。上面的字符串可以编码为
q(&4\=80CHB')
。您可以使用任何可打印字符作为
q
的分隔符,但如果最后一个字符是反斜杠,则必须始终将其加倍,如
q | ABC\123\\\\
for ABC\123\。