【发布时间】:2020-06-19 11:23:18
【问题描述】:
我有一个包含反斜杠 (\something) 的行的简单文本文件。在命令行上的 Perl 脚本中读取它时,我得到的文本行与文件中的文本行完全相同。当将完全相同的代码行复制并粘贴到 CGI 脚本中时,通过为每个反斜杠添加一个反斜杠来以不同方式读取文本文件内容。我花了两天时间搜索各种论坛(StackOverflow、PerlMonks 等),但找不到可能的原因。下面是代码和文本文件。非常感谢任何帮助。
**~/tests/backslash> cat /home/user1/tests/backslash/pattern.txt**
more LaTex formatted strings.
\frac{a}{b} = \frac{5}{7}
**~/tests/backslash> cat test.pl**
my $file = "/home/user1/tests/backslash/pattern.txt";
print STDERR "Attempting to open $file and read the last line...\n";
open(FH, "< $file") or die "ERROR: can't open $file: $!";
my @lines = <FH>;
close(FH);
my $myExpression = $lines[scalar(@lines) - 1];
chomp($myExpression);
print STDERR 'Expr: [' . $myExpression . "]\n";
my $retString = qq{{ "result" : "$myExpression" }};
print STDERR $retString . "\n";
**~/tests/backslash> ./test.pl**
Attempting to open /home/user1/tests/backslash/pattern.txt and read the last line...
Expr: [\frac{a}{b} = \frac{5}{7}]
{ "result" : "\frac{a}{b} = \frac{5}{7}" }
**~/tests/backslash>**
CGI 脚本中完全相同的代码产生以下输出:
我将字符串拆分为数组并检查了每个字符(在 CGI 脚本中),它在“frac”之前有两个反斜杠。 Dumper 也证实了这一点。我试图用'\'替换两个反斜杠,但也没有成功。我在理解和解决这个问题时遇到了许多其他问题(例如,CGI 脚本无法从 /tmp[file not found] 打开相同的文本文件,用 \ 替换两个反斜杠以各种方式失败并出现语法错误,变量值越来越替换时出现意外字符等,但我关注的是这个问题中反斜杠的核心问题。)我在命令行脚本和 CGI 脚本中使所有“使用”类完全相同,以防万一,即使命令行脚本不使用 CGI、JSON 等。
我很困惑为什么完全相同的 Perl 代码在 cgi-bin 中的行为不同。对此的任何帮助、建议、指示或讨论表示赞赏。
My environment:
Suse Linux 13.1
Perl 5.18.1
Apache 2.4.6
Bash 4.2.53
【问题讨论】:
-
Dumper是如何确认这一点的?Dumper输出转义反斜杠和单引号,因此 Dumper 输出中的双反斜杠并不意味着输入中的双反斜杠。试试perl -MData::Dumper -e 'print Dumper(q/123\456/)'。 -
我认为您正在查看的只是日志输出有反斜杠转义,并且脚本没有做任何不同的事情。
-
mob,你是对的,Dumper 正在转义反斜杠。但我尝试了 'my @charArr = split('', $expr);并打印每个字符。此外,为了以防 PRINT 和 Dumper 正在转义字符,我尝试进行比较 ($charArr[i] eq q|\\|) ,它的反斜杠标记的计算结果为 true。为了防止 Perl 插入 q|\\|,我什至尝试在 'here' 文档中制作一个反斜杠作为模式并进行比较,结果仍然确认了两个反斜杠。
-
顺便说一句,我只是将字符串原样返回给网页上的调用 Ajax 函数(内容类型:application/json),并在那里看到两个反斜杠。
-
JSON 编码也将转义输入中的反斜杠。 JSON 输出中的两个反斜杠意味着输入中的一个反斜杠。 . . .
perl -MJSON -e 'print JSON::encode_json([q/123\456/])'
标签: file perl escaping cgi backslash