我有从网络服务获得的数据。数据中包含 \\ 是有效的。数据中包含单个 \ 也是有效的。考虑以下对我的 perl 程序的有效数据输入。我不确定如何确定哪些数据最初具有单个 \ 与双 \\。
$ 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 重新转义反斜杠。
鉴于最初的问题很愚蠢,而且我们现在处于非常具体的领域,我会结束这个问题。
谢谢。