引用perlvar:
...值
$/是字符串,而不是正则表达式.awk必须做得更好.:-)
不难想象这样一个特性会有用的情况 - 解析具有可变长度记录的文件是我经常遇到的经典用例.
到目前为止,我从未遇到过将整个文件加载到内存中并执行以下操作的问题:
my @records = split /my_regex/, <> ;
Run Code Online (Sandbox Code Playgroud)
但由于显而易见的原因,这种技术不能用于可用内存不足的情况.实际上,很多时候不需要同时存储所有记录.
这让我回过头来$/.
我觉得奇怪的是该语言没有提供正则表达式支持$/.这是按设计完成的吗?是否根本无法实施?还有哪些其他解决方法可以被视为缺乏最佳功能的最佳实践?
即使尝试也没有多大意义.很多时候,如果没有阅读结束,你将无法判断你是否到达了终点.在互动情况下这可能非常糟糕.
例如,假设您有以下程序:
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),直到输入另一个字符.
我必须输入第二个命令来处理第一个,第三个命令来处理第二个,等等.这没有任何意义.
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |