在 if 语句中使用 'local' 关键字
Use of 'local' keyword in if statement
我想使用这个代码:
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
我担心它可能会对其他程序产生一些副作用..
第一种方法是使用条件运算符:
{ local $/ = $windows ? "\r\n" : "\n";
...
}
另一种方法是:
{ # enclosing scope
local $/ = "\n";
if ( $windows ) { $/ = "\r\n"; }
...
}
或者,您可以先 local
然后 然后 分配它:
{ local $/;
if ( $windows ) {
$/ = "\r\n";
}
else {
$/ = "\n";
}
...
}
您现在已经解释了您的 $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/
不会工作
我想使用这个代码:
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
我担心它可能会对其他程序产生一些副作用..
第一种方法是使用条件运算符:
{ local $/ = $windows ? "\r\n" : "\n";
...
}
另一种方法是:
{ # enclosing scope
local $/ = "\n";
if ( $windows ) { $/ = "\r\n"; }
...
}
或者,您可以先 local
然后 然后 分配它:
{ local $/;
if ( $windows ) {
$/ = "\r\n";
}
else {
$/ = "\n";
}
...
}
您现在已经解释了您的 $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/
不会工作