【发布时间】: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