我有从网络服务获得的数据。数据中包含\\是有效的。此外,数据中包含单个\也是有效的。考虑我的perl程序的以下有效数据输入。我不确定如何确定哪个数据原来只有一个\ vs一个双\ \。
$ cat data.pl
my $data ='=01=00=00=00=DF=FC=D3Y\=03';
my $data2='=01=00=00=00=DF=FC=D3Y\\=03';
print $data;
注意上面代码中$ data和$ data2的唯一区别是$ data2有一个额外的反斜杠。我也不想逃避反斜杠。反斜杠只是此数据流中的有效数据。两者都可以,并且发生在我的数据中。
调试会话:
$ perl -d data.pl
Loading DB routines from perl5db.pl version 1.37
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(data.pl:1): my $data='=01=00=00=00=DF=FC=D3Y\=03';
DB<1> n
main::(data.pl:2): my $data2='=01=00=00=00=DF=FC=D3Y\\=03';
DB<1> x $data
0 '=01=00=00=00=DF=FC=D3Y\\=03'
DB<2> p $data
=01=00=00=00=DF=FC=D3Y\=03
DB<3> l
2==> my $data2='=01=00=00=00=DF=FC=D3Y\\=03';
3: print $data;
DB<3> n
main::(data.pl:3): print $data;
DB<3> x $data2
0 '=01=00=00=00=DF=FC=D3Y\\=03'
DB<4> p $data2
=01=00=00=00=DF=FC=D3Y\=03
所以即使我的输入不同,perl认为它们都是相同的数据,因为\\是标量中的单个反斜杠,因此是\。在作业声明之后,似乎对我来说已经结束了。我已经输了数据是否有\\或\。
似乎某个级别的perlio层通过在它们成为标量之前转义反斜杠来处理这个问题?对于进入我程序的数据,我不确定我在哪里正确逃脱。
数据从HTTP服务通过LWP :: UserAgent流向一些最终在我的程序中的perl类。在获得标量后,有没有办法在我的数据中处理这个\\ vs \?
修改
经过ikegami的进一步研究和输入后,我意识到这个问题现在很愚蠢,我对如何在perl中发生反斜杠的转移感到困惑。任何接受输入的东西都会转义反斜杠,以便它可以在perl中正确表示。在我的情况下,我在数据路径上丢失了一些对我来说不明显的反斜杠。
$ perl -d data.pl
Loading DB routines from perl5db.pl version 1.37
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(data.pl:5): my $data='{ "data": "=01=00=00=00=DF=FC=D3Y\\\\=03" }';
DB<1> n
main::(data.pl:6): my $decoded = decode_json($data);
DB<2> x $decoded
0 HASH(0x175fcf8)
'data' => '=01=00=00=00=DF=FC=D3Y\\=03'
就我而言,我必须通过json_decode重新转义反斜杠。
鉴于最初的问题很愚蠢,我们现在处于非常具体的范围,我会关闭这个问题。
感谢。
答案 0 :(得分:4)
您似乎认为my $data1 = '=01=00=00=00=DF=FC=D3Y\\=03';
将'=01=00=00=00=DF=FC=D3Y\\=03'
置于标量中,但这完全是错误的。
字符串文字(即代码段)'=01=00=00=00=DF=FC=D3Y\\=03'
计算为字符串=01=00=00=00=DF=FC=D3Y\=03
。赋值将该字符串放在标量中。
类似地,字符串文字'=01=00=00=00=DF=FC=D3Y\=03'
计算为字符串=01=00=00=00=DF=FC=D3Y\=03
。赋值将该字符串放在标量中。
同样,<$fh>
计算字符串=01=00=00=00=DF=FC=D3Y\=03
(从包含=01=00=00=00=DF=FC=D3Y\=03
的文件中读取时)。赋值将该字符串放在标量中。
没有办法告诉这些代码中的哪一个产生了字符串。
因此即使我的输入不同,perl认为它们都是相同的数据,因为\\是标量中的单个反斜杠,因此是\。
这没有任何意义。您的示例中没有输入,并且Perl没有做任何&#34;考虑&#34;。你只需要两个相同的代码片段。
数据从HTTP服务通过LWP :: UserAgent流向一些最终在我的程序中的perl类。在获得标量后,有没有办法在我的数据中处理这个\\ vs \?
LWP :: UserAgent将提供服务器返回的内容。它没有执行你所描述的那种转换。
控制台1:
$ nc -l 8888 <<'.'
HTTP/1.1 200 OK
Content-Type: text/plain
=01=00=00=00=DF=FC=D3Y\=03
=01=00=00=00=DF=FC=D3Y\\=03
.
控制台2:
$ perl -MLWP::UserAgent -e'print LWP::UserAgent->new->get("http://localhost:8888")->content'
=01=00=00=00=DF=FC=D3Y\=03
=01=00=00=00=DF=FC=D3Y\\=03