$ /是否有可能支持正则表达式?

Zai*_*aid 7 perl

引用perlvar:

...值$/是字符串,而不是正则表达式.awk必须做得更好.:-)

不难想象这样一个特性会有用的情况 - 解析具有可变长度记录的文件是我经常遇到的经典用例.

到目前为止,我从未遇到过将整个文件加载到内存中并执行以下操作的问题:

my @records = split /my_regex/, <> ;
Run Code Online (Sandbox Code Playgroud)

但由于显而易见的原因,这种技术不能用于可用内存不足的情况.实际上,很多时候不需要同时存储所有记录.

这让我回过头来$/.

我觉得奇怪的是该语言没有提供正则表达式支持$/.这是按设计完成的吗?是否根本无法实施?还有哪些其他解决方法可以被视为缺乏最佳功能的最佳实践?

ike*_*ami 8

即使尝试也没有多大意义.很多时候,如果没有阅读结束,你将无法判断你是否到达了终点.在互动情况下这可能非常糟糕.

例如,假设您有以下程序:

local $/ = qr/\n|\r\n?/;  # Handle Windows, Unix and old MacOS line endings.
while (1) {
   print "Please enter a command: ";
   my $cmd = <>;
   $cmd =~ s{$/\z}{};
   process($cmd);
}
Run Code Online (Sandbox Code Playgroud)

看起来很简单吧?实际上,支持qr/\n|\r\n?/可能是此请求的首要原因.好吧,即使是那么简单的代码也存在严重缺陷.假设我使用MacOS行结尾(CR,^ M,\ r \n)

 $ processor
 Please enter a command: foo^M
 [hangs]
Run Code Online (Sandbox Code Playgroud)

该程序挂起,因为它无法判断我是否给它一个MacOS行结束(CR,^ M,\ r)或Windows行结束(CRLF,^ M ^ J,\ r \n),直到输入另一个字符.

我必须输入第二个命令来处理第一个,第三个命令来处理第二个,等等.这没有任何意义.