为什么在 Perl 中使用 __DATA__ 时没有输出?

1 perl macos-catalina

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

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

__DATA__
line1
line2
line3
Run Code Online (Sandbox Code Playgroud)

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

两个系统上的 Hexdump 是相同的:

麦克迷你:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

麦克迷你:

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

iMac:

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

__DATA__
line1
line2
line3
Run Code Online (Sandbox Code Playgroud)

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

bri*_*foy 8

__DATA__很好,并且没有特定于平台的问题(并且您可以用它做很多愚蠢的技巧)。

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

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

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