我有一个简单的文本文件,其行包含反斜杠(\ 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'之前有两个反斜杠。倾销者也确认了这一点。我试图用'\'代替两个反斜杠,但都没有成功。我在理解和解决此问题时遇到了许多其他问题(例如,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
答案 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的配置后,它正确呈现了字符串。我要离开这个问题并回答,希望它可以为某人节省一些时间。谢谢大家阅读,评论和回答。