使用' local' if语句中的关键字

时间:2015-08-25 14:55:11

标签: perl cross-platform

我想使用此代码:

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

我害怕它可能会对其他程序产生一些副作用..

2 个答案:

答案 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/无效