【问题标题】:Why don't I get output when I use __DATA__ in Perl?为什么我在 Perl 中使用 __DATA__ 时没有得到输出?
【发布时间】:2021-06-22 09:03:13
【问题描述】:

有人知道 macOS Catalina 上的 Perl __DATA__ 语法是否已弃用?我正在运行 perl v5.18.4,即使是这样的简单程序也没有输出(也没有错误);

use strict;
use warnings;
while(<DATA>){
    print $_;
}

__DATA__
line1
line2
line3

编辑: 这很奇怪。我之前说过我有 2 个 Mac 系统,都有同样的问题。不太对,在一个系统上该程序可以工作,而在另一个系统上该程序则不能。

两个系统上的Hexdump是一样的:

Mac Mini:

Mac-mini-van-Theo:Programming theo$ hexdump -C test.pl
00000000  75 73 65 20 73 74 72 69  63 74 3b 0d 75 73 65 20  |use strict;.use |
00000010  77 61 72 6e 69 6e 67 73  3b 0d 77 68 69 6c 65 28  |warnings;.while(|
00000020  3c 44 41 54 41 3e 29 20  7b 0d 20 20 20 20 70 72  |<DATA>) {.    pr|
00000030  69 6e 74 20 24 5f 3b 0d  7d 0d 5f 5f 44 41 54 41  |int $_;.}.__DATA|
00000040  5f 5f 0d 6c 69 6e 65 31  0d 6c 69 6e 65 32 0d 6c  |__.line1.line2.l|
00000050  69 6e 65 33 0d                                    |ine3.|
00000055

iMac:

Theo@iMac-van-Theo Programming % hexdump -C test.pl
00000000  75 73 65 20 73 74 72 69  63 74 3b 0a 75 73 65 20  |use strict;.use |
00000010  77 61 72 6e 69 6e 67 73  3b 0a 77 68 69 6c 65 28  |warnings;.while(|
00000020  3c 44 41 54 41 3e 29 7b  0a 20 20 20 20 70 72 69  |<DATA>){.    pri|
00000030  6e 74 20 24 5f 3b 0a 7d  0a 0a 5f 5f 44 41 54 41  |nt $_;.}..__DATA|
00000040  5f 5f 0a 6c 69 6e 65 31  0a 6c 69 6e 65 32 0a 6c  |__.line1.line2.l|
00000050  69 6e 65 33 0a                                    |ine3.|
00000055

但是,“猫”或“更多”显示出差异:

Mac Mini:

Mac-mini-van-Theo:Programming theo$ more test.pl
use strict;^Muse warnings;^Mwhile(<DATA>) {^M    print $_;^M}^M__DATA__^Mline1^Mline2^Mline3

iMac:

Theo@iMac-van-Theo Programming % more test.pl 
use strict;
use warnings;
while(<DATA>){
    print $_;
}

__DATA__
line1
line2
line3

区别? Mac Mini 使用“bash”作为 shell(程序失败的地方),iMac 使用“zsh”。所以问题不是真正与 perl 相关,而是 perl/shell 相关。在 Catalina 中,Zsh 用作默认 shell,但旧的 Bash shell 仍然包含在 macOS 中,您仍然可以切换到它。这似乎与shell如何处理行尾有关,尽管我不明白为什么会发生这种情况以及如何解决它。

【问题讨论】:

  • 至少在我的环境下(macOS Big Sur,perl v5.28.3),你的代码是ok的,没有问题。
  • 检查你的行尾?
  • 尝试在读取 DATA 之前和之后打印一些输出,看看它是否只是数据句柄的问题。
  • 这看起来确实像是行尾问题。我在mac上使用bash,没有这个问题,。
  • 请再次检查您的 hexdump - 在一种情况下 eol 是 0d (13) 而在其他情况下是 0a (10)

标签: perl macos-catalina


【解决方案1】:

__DATA__ 很好,没有特定于平台的问题(您可以使用很多stupid tricks)。

但是,如果您想了解任何特定 Perl 事物的状态,请参阅 perldeprecation 文档。有时perlexperiment 也很方便。

你是如何运行你的程序的?

提供程序的十六进制转储:hexdump -C program.pl。也许有有趣的角色。

【讨论】:

  • 在 DATA 上非阻塞排他群以确保单个脚本实例(只需阅读技巧文章)。
  • 行尾没问题。 __DATA__ 前后没有空格或 CR。我通过终端运行测试程序。我有 2 个 Mac 系统,都使用 perl v5.18.4 运行 Catalina。他们都有同样的问题。其他 perl 程序运行良好,只是 __DATA__ 的问题,我不知道是什么问题。
  • 更新您的问题并进行澄清
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多