我想使用此代码:
if ($windows) {
local $/ = "\r\n";
} else {
local $/ = "\n";
}
# ... code reading a file line by line
但它不起作用,因为本地将范围限制在括号内。我该怎么办?
这是正确的方法吗?
if ($windows) {
$/ = "\r\n";
} else {
$/ = "\n";
}
# ... code reading a file line by line
我害怕它可能会对其他程序产生一些副作用..
答案 0 :(得分:6)
第一种方法是使用条件运算符:
{ local $/ = $windows ? "\r\n" : "\n";
...
}
你能做到的另一种方式是:
{ # enclosing scope
local $/ = "\n";
if ( $windows ) { $/ = "\r\n"; }
...
}
或者,你可以先local
然后然后分配它:
{ local $/;
if ( $windows ) {
$/ = "\r\n";
}
else {
$/ = "\n";
}
...
}
答案 1 :(得分:4)
您现在已经解释过,您的$windows
标志表明该文件的来源是否为Windows平台
我会选择一种完全不同的方法。你可以
my $fh;
if ( $windows ) {
open $fh, '<:crlf', $filename;
}
else {
open $fh, '<', $filename;
}
或者,也许最好,只是正常打开
open my $fh, '<', $filename;
然后将其读作
while ( <$fh> ) {
s/\R\z//;
# Process line
}
使用s/\R\z//
代替chomp
将删除尾随行终结符,无论其来源如何。遗憾的是$/
不是正则表达式模式,因此local $/ = qr/\R/
无效