Perl CGI 脚本错误地读取带有反斜杠的文本文件内容
Perl CGI script reads text file content with backslash incorrectly
我有一个简单的文本文件,其中的行包含反斜杠 (\something)。在命令行的 Perl 脚本中读取它时,我得到的文本行与文件中的文本行完全相同。当将完全相同的代码行复制并粘贴到 CGI 脚本中时,通过为每个反斜杠添加一个反斜杠来读取不同的文本文件内容。我花了两天时间搜索各种论坛(Whosebug、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 [找不到文件] 打开相同的文本文件,以各种方式用 \ 替换两个反斜杠因语法错误而失败,变量值正在获取替换等时出现意外字符,但我关注的是这个问题中反斜杠的核心问题。)我在命令行脚本和 CGI 脚本中将所有 'use' 类 完全相同,以防万一,即使命令行脚本不使用 CGI,JSON,等等
我很困惑为什么完全相同的 Perl 代码在 cgi-bin 中表现不同。对此的任何帮助、建议、指示或讨论都将不胜感激。
My environment:
Suse Linux 13.1
Perl 5.18.1
Apache 2.4.6
Bash 4.2.53
请查看以下编码风格是否更合适
use strict;
use warnings;
use feature 'say';
my $file = '/home/user1/tests/backslash/pattern.txt';
say STDERR "Attempting to open $file and read the last line...";
open my $fh, '<', $file
or die "ERROR: can't open $file: $!";
my @lines = <$fh>;
close(FH);
my $myExpression = pop @lines;
chomp($myExpression);
say STDERR "Expr: [$myExpression]";
my $retString = qq{{ "result" : "$myExpression" }};
say STDERR $retString;
注意: perl 有运算符 pop 来提取数组的最后一个元素
注意: 双引号字符串假定变量插值,应该相应地使用它——如果字符串中没有变量,那么双引号可能放错地方了
注意: 免费书籍 Modern Perl 可在线获取——参见 'Input and Output' 第 138 页
注意: use strict; use warnings
可以避免许多陷阱
我想我知道问题出在哪里了。它在 MathJax 中接受 LaTex 字符串并进行渲染。它一直用反斜杠渲染字符串,所以我追溯了双反斜杠的来源,并最终在 http 日志中找到了它们。对文件的任何打印也会导致转义。命令行上 运行 时的脚本将其打印到终端,因此不会转义反斜杠。当cgi-bin 中的运行 时,不转义就无法看到实际的字符串。将字符串拆分为数组并单独打印字符没有区别。数组元素与引用 q|\| 的比较也受制于 escaping/interpolation。因此,我无法以任何其他方式验证这一点。最后,在修复 MathJax 的配置后,它正确地呈现了字符串。我留下这个问题并回答希望它能为某人节省一些时间。感谢大家的阅读、评论和回答。
我有一个简单的文本文件,其中的行包含反斜杠 (\something)。在命令行的 Perl 脚本中读取它时,我得到的文本行与文件中的文本行完全相同。当将完全相同的代码行复制并粘贴到 CGI 脚本中时,通过为每个反斜杠添加一个反斜杠来读取不同的文本文件内容。我花了两天时间搜索各种论坛(Whosebug、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 脚本中的这段完全相同的代码会产生以下输出:
我很困惑为什么完全相同的 Perl 代码在 cgi-bin 中表现不同。对此的任何帮助、建议、指示或讨论都将不胜感激。
My environment:
Suse Linux 13.1
Perl 5.18.1
Apache 2.4.6
Bash 4.2.53
请查看以下编码风格是否更合适
use strict;
use warnings;
use feature 'say';
my $file = '/home/user1/tests/backslash/pattern.txt';
say STDERR "Attempting to open $file and read the last line...";
open my $fh, '<', $file
or die "ERROR: can't open $file: $!";
my @lines = <$fh>;
close(FH);
my $myExpression = pop @lines;
chomp($myExpression);
say STDERR "Expr: [$myExpression]";
my $retString = qq{{ "result" : "$myExpression" }};
say STDERR $retString;
注意: perl 有运算符 pop 来提取数组的最后一个元素
注意: 双引号字符串假定变量插值,应该相应地使用它——如果字符串中没有变量,那么双引号可能放错地方了
注意: 免费书籍 Modern Perl 可在线获取——参见 'Input and Output' 第 138 页
注意: use strict; use warnings
可以避免许多陷阱
我想我知道问题出在哪里了。它在 MathJax 中接受 LaTex 字符串并进行渲染。它一直用反斜杠渲染字符串,所以我追溯了双反斜杠的来源,并最终在 http 日志中找到了它们。对文件的任何打印也会导致转义。命令行上 运行 时的脚本将其打印到终端,因此不会转义反斜杠。当cgi-bin 中的运行 时,不转义就无法看到实际的字符串。将字符串拆分为数组并单独打印字符没有区别。数组元素与引用 q|\| 的比较也受制于 escaping/interpolation。因此,我无法以任何其他方式验证这一点。最后,在修复 MathJax 的配置后,它正确地呈现了字符串。我留下这个问题并回答希望它能为某人节省一些时间。感谢大家的阅读、评论和回答。