【问题标题】:Why can't my Perl script find the file when I run it from Windows?为什么当我从 Windows 运行我的 Perl 脚本时找不到该文件?
【发布时间】:2011-04-18 15:47:40
【问题描述】:

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

我正在使用这个命令perl rgex.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 );
}

当我在 windows 命令提示符下运行时,它会出现以下错误:

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

请对代码提供一些建议。谢谢。

【问题讨论】:

  • 我认为 Term::ANSIColor 模块不适用于 Windows。
  • 是的,但仅在 IDE 上受支持。
  • 控制台也支持。只需 use Win32::Console::ANSI 在您的程序顶部。然后,您可以打印 ANSI 转义序列(如 Term::ANSIColor 生成的转义序列),它们就可以工作了。
  • 请注意,它是“代码”,而不是“代码”——除非你能告诉我们有多少。
  • @reinierpost 嘿,伙计们,这个问题已经回答并关闭,所以请停止发帖,因为我必须做一些小的修改,所以请体谅。

标签: windows perl command-prompt


【解决方案1】:

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

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

由于您没有在字符串中插入任何变量,因此最好使用单引号:

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

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

【讨论】:

  • 效果很好!谢谢老哥!
  • 在这种情况下最好使用单引号,因为不需要变量插值。
  • @Alan:将其添加到答案中。谢谢。
【解决方案2】:

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

当您遇到此类问题时,请将程序缩减为仅存在问题的行并开始处理它们。首先从第一个错误开始,因为它们通常会级联到您稍后看到的错误。

当你想检查你得到的值时,打印它以确保它是你认为的:

 my $file = "C:\\D....";
 print "file is [$file]\n";

这会很快告诉您$file 存在问题,一旦您知道问题出在哪里,您就可以解决问题。

这只是基本的调试技术。

此外,您还缺少很多基础知识,因此阅读优秀的 Perl 教程将对您有很大帮助。在perlfaq2perlbook 中列出了几个。您遇到的许多问题都是 Learning Perl 在前几章中处理的。

【讨论】:

  • 我浏览了教程,但没有一篇涵盖 Windows 中使用的 Perl 正则表达式。
  • 嗯,这里没有正则表达式问题,这也不是 Windows 问题。它只是一个单引号字符串。我们在Learning Perl 中对此进行了介绍,因此您可能需要更好的教程。 :)
猜你喜欢
  • 2011-04-17
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多