在 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/ 不会工作