Perl CGI脚本错误地读取带有反斜杠的文本文件内容

时间:2020-03-06 17:26:45

标签: file perl escaping cgi backslash

我有一个简单的文本文件,其行包含反斜杠(\ 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脚本中完全相同的代码将产生以下输出:

Output from CGI script 我将字符串拆分为数组,并检查了每个字符(在CGI脚本中),在'frac'之前有两个反斜杠。倾销者也确认了这一点。我试图用'\'代替两个反斜杠,但都没有成功。我在理解和解决此问题时遇到了许多其他问题(例如,CGI脚本无法从/ tmp [找不到文件]打开同一文本文件,用\替换两个反斜杠,但由于语法错误而以各种方式失败,变量值越来越大)替换时出现意外字符等,但我将重点放在此问题中的反斜杠的核心问题上。)我将所有“ use”类在命令行脚本和CGI脚本中完全相同,以防万一,即使命令行脚本不使用CGI,JSON等。

我很困惑为什么完全相同的Perl代码在cgi-bin中表现不同。对此有任何帮助,建议,指示或讨论。

My environment:
Suse Linux 13.1
Perl 5.18.1
Apache 2.4.6
Bash 4.2.53

2 个答案:

答案 0 :(得分:0)

请查看以下编码样式是否更合适

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可在线获得-参见'输入和输出'第138页

注意:use strict; use warnings可以避免很多陷阱

答案 1 :(得分:0)

我想我知道问题出在哪里。在MathJax中,它需要LaTex字符串并进行渲染。它一直使用反斜杠来呈现字符串,因此我追溯了双反斜杠来自何处,并最终在http日志中找到了它们。对文件的任何打印也会导致转义。在命令行上运行脚本时,会将其打印到终端,因此不会转义反斜杠。在cgi-bin中运行时,没有转义就无法看到实际的字符串。将字符串分成数组并分别打印字符没有区别。数组元素与引用的q | \ |的比较也要进行转义/插值。因此,我无法以任何其他方式对此进行验证。最后,在修复了MathJax的配置后,它正确呈现了字符串。我要离开这个问题并回答,希望它可以为某人节省一些时间。谢谢大家阅读,评论和回答。

相关问题