为什么可以';当我从Windows运行Perl脚本时,它找不到文件吗?

为什么可以';当我从Windows运行Perl脚本时,它找不到文件吗?,windows,perl,command-prompt,Windows,Perl,Command Prompt,我有一个Perl脚本,它是使用Perl5.8在Linux平台上构建的。但是,现在我尝试在Windows平台命令提示符下使用相同的Perl版本运行Perl脚本 我正在使用这个命令perlrgex.pl,但是它给了我一整段错误,在我看来,它已经在脚本本身中得到了解决。奇怪的是,我能够运行另一个Perl脚本,而不会出现由打印、输入等简单函数组成的问题 守则: #!/usr/bin/perl use warnings; use strict; use Term::ANSIColor; my $fil

我有一个Perl脚本,它是使用Perl5.8在Linux平台上构建的。但是,现在我尝试在Windows平台命令提示符下使用相同的Perl版本运行Perl脚本

我正在使用这个命令
perlrgex.pl
,但是它给了我一整段错误,在我看来,它已经在脚本本身中得到了解决。奇怪的是,我能够运行另一个Perl脚本,而不会出现由打印、输入等简单函数组成的问题

守则:

#!/usr/bin/perl

use warnings;
use strict;
use Term::ANSIColor;

my $file = "C:\Documents and Settings\Desktop\logfiles.log";
open LOG, $file or die "The file $file has the error of:\n =>  $!";

my @lines = <LOG>;
close (LOG);

my $varchar = 0;

foreach my $line ( @lines ) {
if ( $line =~ m/PLLog/ ) 
{
    print("\n\n\n");
my $coloredText = colored($varchar, 'bold underline red');
print colored ("POS :: $coloredText\n\n", 'bold underline red');
$varchar ++;        
}
print( $line );
}
#/usr/bin/perl
使用警告;
严格使用;
使用术语:ANSIColor;
my$file=“C:\Documents and Settings\Desktop\logfiles.log”;
打开日志,$file或死亡“文件$file的错误为:\n=>$!”;
我的@lines=;
关闭(日志);
我的$varchar=0;
foreach my$行(@行){
如果($line=~m/PLLog/)
{
打印(“\n\n\n”);
my$coloredText=colored($varchar,'粗体下划线红色');
彩色打印(“位置:$coloredText\n\n”,“粗体下划线红色”);
$varchar++;
}
打印(行);
}
在windows命令提示符下运行时,会出现以下错误:

  • 在rgex.pl第7行传递了无法识别的转义\D
  • =>rgex.pl第8行没有这样的文件或目录

请给我一些关于代码的建议。谢谢。

Perl字符串中的
\
用双引号括起来,表示转义序列的开始,如换行符的
\n
,制表符的
\t
。由于您希望
\
被逐字处理,因此您需要像
\
那样转义
\

my $file = "C:\\Documents and Settings\\Desktop\\logfiles.log";
由于您没有在字符串中插入任何变量,因此最好使用单引号:

my $file = 'C:\Documents and Settings\Desktop\logfiles.log';

(在单引号内,
\
不是特别的,除非下一个字符是反斜杠或单引号。)

Perl字符串中包含在双引号中的
\
标记转义序列的开始,如
\n
用于换行符,
\t
用于制表符。由于您希望
\
被逐字处理,因此您需要像
\
那样转义
\

my $file = "C:\\Documents and Settings\\Desktop\\logfiles.log";
由于您没有在字符串中插入任何变量,因此最好使用单引号:

my $file = 'C:\Documents and Settings\Desktop\logfiles.log';

(在单引号内,
\
并不特殊,除非下一个字符是反斜杠或单引号。)

这些错误消息非常清楚。它们会准确地告诉您问题所在的行(不像一些错误消息,它们会告诉您Perl首先出现在哪一行,尽管“嘿,等一下!”)

当您遇到这些问题时,请将程序简化为有问题的行并开始处理它们。首先从第一个错误开始,因为它们通常会级联到您稍后看到的错误

当您想要检查您获得的值时,请打印它以确保它是您认为的值:

 my $file = "C:\\D....";
 print "file is [$file]\n";
这会很快告诉您,
$file
存在问题,一旦您知道问题所在,您就可以找到解决问题的大部分方法

这只是基本的调试技术


此外,您还缺少很多基础知识,因此学习一个好的Perl教程将对您大有帮助。或中列出了几个。您遇到的许多问题都是学习Perl在前几章中要解决的问题。

这些错误消息非常清楚。它们会准确地告诉您问题所在的行(不像一些错误消息,它们会告诉您Perl首先出现在哪一行,尽管“嘿,等一下!”)

当您遇到这些问题时,请将程序简化为有问题的行并开始处理它们。首先从第一个错误开始,因为它们通常会级联到您稍后看到的错误

当您想要检查您获得的值时,请打印它以确保它是您认为的值:

 my $file = "C:\\D....";
 print "file is [$file]\n";
这会很快告诉您,
$file
存在问题,一旦您知道问题所在,您就可以找到解决问题的大部分方法

这只是基本的调试技术



此外,您还缺少很多基础知识,因此学习一个好的Perl教程将对您大有帮助。或中列出了几个。您遇到的许多问题都是学习Perl在前几章中要解决的问题。

我认为术语::ANSIColor模块在Windows上不起作用。是的,它受支持,但仅在IDE上受支持。它在控制台上也受支持。就在你程序的顶端。然后你可以打印ANSI转义序列(像由生成的转义序列),它们就可以工作了。请注意,它是“代码”,而不是“代码”-除非你能告诉我们有多少。@reinierpost嘿,伙计们,这个问题已经回答并结束了,所以请停止发帖,因为我必须做一些小的编辑,所以请考虑一下。我认为Term::ANSIColor模块在Windows上不工作。是的,它受支持,但仅在IDE上。它在控制台上也受支持。就在你程序的顶端。然后你可以打印ANSI转义序列(如生成的转义序列),它们就可以工作了。请注意,这是“代码”,而不是“代码”-除非你能告诉我们有多少。@reinierpost嘿,伙计们,这个问题已经回答并结束了,所以请停止发帖,因为我必须做一些小的编辑,所以请仔细考虑。效果很好!谢谢你,伙计!在这种情况下最好使用单引号,因为不需要变量插值。@Alan:将其添加到答案中。谢谢,效果很好!谢谢你,伙计!在这种情况下最好使用单引号,因为不需要变量插值。@Alan:将其添加到答案中。谢谢。我浏览了教程,但没有一本涉及Windows中使用的Perl正则表达式。这里没有正则表达式问题,这不是Windows的问题。它只是一个带引号的字符串。我们将在学习Perl中介绍这一点,因此您可能需要更好的教程。:)我浏览了教程,但没有一本涉及Perl