【问题标题】:Comments in Perl5 crash the program?Perl5 中的注释使程序崩溃?
【发布时间】:2011-12-29 04:30:04
【问题描述】:

我在一些互联网教程的帮助下自学 Perl,在大多数情况下,它运行得非常好,一切运行顺利。但是,我不能执行任何 cmets,否则程序将无法正常运行。例如以下代码:

#eee
print "Estimation of Pi";

会运行,但不会打印任何东西,而只是这个

print "Estimation of Pi";

运行并打印它的意思。

我做错了什么?我完全不明白。

另外,顺便说一句,#!/usr/bin/perl 需要什么?没有它,我的程序似乎运行良好(作为评论,程序无法使用它)

【问题讨论】:

  • 你是如何运行你的 Perl 脚本的?你在什么环境下?
  • 您输入的字符“#”有什么价值?例如,如果您执行“od -c file.pl”,您会看到“#”吗?理想情况下,如果您进行逐个字符的十六进制转储,“#”的代码是 0x23 吗?我不确定它可能是什么,但这是你看到的奇怪行为。 #!/usr/bin/perl (shebang) 表示法表示,如果您键入 file.pl(而不是 perl file.pl),则会执行正确的程序(/usr/bin/perl)。
  • @EricStrom,它返回 Perl 5.14.2。
  • @Sarnold,下面我说,W7 64bit,ActivePerl 64bit,通过命令行简单地使用'test.pl'来执行。
  • @user1092865 => 因为您在 Windows 上,所以 #!行被忽略。你用什么程序来编辑你的 perl 文件?它是程序员的文本编辑器,还是文字处理器?

标签: perl comments


【解决方案1】:

我怀疑您的文件不包含您认为的内容。也许你有一个 CR 而不是 LF 或 CRLF。

>perl -e"binmode STDOUT; print qq{#eee\rprint qq{foo\\n}}" | perl

>perl -e"binmode STDOUT; print qq{#eee\nprint qq{foo\\n}}" | perl
foo

>perl -e"binmode STDOUT; print qq{#eee\r\nprint qq{foo\\n}}" | perl
foo

使用十六进制编辑器检查您的文件,或者更糟的是使用以下命令:

perl -0777nE"BEGIN { binmode STDIN } say join ' ', unpack '(A2)*', unpack 'H*', $_" < file

#! 是一个 unix 概念。 Windows 不使用它,但 Perl 会在该行上查找命令行选项。例如,以下会发出警告:

#!perl -w
print undef;

【讨论】:

  • 为了详细说明以防其他人遇到类似问题,我使用 Notepad++ 编辑我的 .pl 文件。我使用了 View -> Show Symbols -> Show End Of Line,最后只显示了 CR。然后我用 Edit -> EOL Format -> Windows 来改变它。
【解决方案2】:

这听起来很奇怪。你是如何执行那个程序的?如果您在需要 windows 样式换行符但使用生成 unix 样式换行符的文本编辑器创建它的系统上运行该程序,则会导致您的问题。如果您在 Windows 上,请尝试确保您的文本编辑器配置为使用 Windows 样式的换行符。

#!/usr/bin/perl 不是评论。这称为 shebang 行,在 unix 系统上,如果您执行一个文本文件(也就是说,您 chmod +x filename.pl 然后使用 ./filename.pl 而不是 perl filename.pl 执行它),系统会在第一行查找它如果找到它,则将整个文件传递给位于该文件的实用程序,在本例中为/usr/bin/perl。它仅在 unix 系统上有用,并且仅在您想让脚本可执行时才有用。

作为另一个提示 - perl 对传递给print 的任何内容都使用输出缓冲区。这意味着,如果您 print 某些内容不以换行符 (\n) 结尾,则它会保存在缓冲区中,直到您刷新缓冲区(在 perl 中通常不是必需的),打印包含换行符的内容,或者退出程序。您可以通过将$| = 1; 添加到您的程序来覆盖此功能,但最好只用换行符结束您的消息,否则您的屏幕只会变得混乱。

【讨论】:

  • 抱歉,我应该将此信息放在 OP 中。我正在使用 Windows 64 位,ActivePerl 64 位。我正在浏览命令行,导航到存储我的脚本的目录并使用“test.pl”简单地运行它们。稍后我会添加更多信息。
  • shebang。 Crunchbang 是一个 linux 发行版。
  • 嗯。 Crunchbang 使用#! 作为他们的标志,我一直认为他们也是以它命名的。
【解决方案3】:

可能是您将脚本作为 shell 脚本而不是 Perl 脚本执行,并且您的 $PATH 中恰好有一个 print 命令。这假设您处于类 Unix 环境中。 (事实证明,你不是;你在 Windows 上。但这个答案可能对其他人有用。)

如果您将print 更改为echo,会发生什么情况?由于echo 不是有效的 Perl 命令,如果它仍然有效,我的猜测可能是正确的。

脚本的第一行应该是

#!/usr/bin/perl

这个“shebang”告诉系统当你按名称运行脚本时如何执行它。或者您可以使用perl 显式运行它:

perl ./script_name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    相关资源
    最近更新 更多