使用 $/ 而不是 \n 进行打印是否有问题?

15

Perl的文档说,$/是:

 

输入记录分隔符,默认为换行符。这影响了Perl认为“一行”是什么的想法。

那么,基本上这么做是错误的吗:

print STDERR $var, $/;

替代:

print STDERR "$var\n";

?

如果我选择前者,可能会出什么问题?


1
它是输入分隔符,如果您需要读取CRLF或CR编码的文件,则可以对其进行操作。 - tadman
$/ 是系统的行尾符号,如果你生成的文件只是用于“本地”使用,那么这是可以的。但如果你要为其他操作系统生成文件,例如在 Linux 上构建 Windows 文件,则 $/ 就无用了。 - Marc B
3
你应该真的使用输出记录分隔符$ \,但我看不出这样做有什么问题。事实上,say函数就是这样做的: "say LIST只是{local $\="\n";print LIST}的缩写"(如果你使用的是5.10+版本,我会直接使用say)。 - ThisSuitIsBlackNot
Marc的评论是完全正确的! $/指的是默认系统eol字符。您可以根据使用它的上下文进行更改。 - user3476791
2
@user3476791:不,Perl会尽力隐藏系统的行尾符(或序列),并将其呈现为换行符 "\n" 传递给您的Perl代码。当您想要检索使用<>运算符的输入记录与文本行不一致时,才需要操作$/。这就是为什么它被称为输入记录分隔符而不是输入行分隔符的原因。 - Borodin
1
@Borodin 是正确的,Mark B 是错误的。$/ 在任何系统上默认为“\n”;CRLF 转换通常在 I/O 函数中处理,因此您的代码只会看到/生成“\n”。 - ysth
3个回答

9
也许您正在寻找输出记录分隔符?
参考 perldoc perlvar
IO::Handle->output_record_separator( EXPR ) $OUTPUT_RECORD_SEPARATOR $ORS $\ print操作符的输出记录分隔符。 如果定义了该值,则在print的参数的最后一个之后打印该值。默认值为“undef”。
您不能在句柄上调用“output_record_separator()”,只能作为静态方法调用。请参阅IO::Handle
助记符:您设置“$\”而不是在print的末尾添加“\n”。此外,它就像$/,但这是您从Perl“返回”的内容。
例如,
$\ = $/;
print STDERR $var;

5
我认为这是一个非常糟糕的想法。不多的模块会保护自己免受$\ 变化的影响,因此全局更改$\ 将会导致它们崩溃。你可以使用{local $\ = $/; print STDERR $var;}来限制更改的范围,但与print STDERR "$var\n";say STDERR $var;相比,这是一种完全混乱的方式。 - ikegami
2
@ikegami 而且我认为,如果模块不能处理$ \ -的更改,那么这就是模块中的一个错误,特别是考虑到有一个常用的命令行选项可以设置$ \ --l)。 - user743382
2
@hvd,可能在一行代码中常用,但我怀疑很少有模块在每个print之前都执行local $/;,因为这样做是愚蠢的,即使你认为它是一个错误。 - ikegami

7

$/ 默认情况下是 LF (U+000A)。 这就是"\n"[1]产生的相同字符。 因此,除非您更改了$/,否则$/"\n"是等价的。 如果您更改了$/,那么只有您知道原因,因此只有您知道$/"\n"哪个更合适。


  1. 在古老的 MacOS 系统中,$/ 的默认值为 CR(U+000D),但在这种情况下 "\n" 也会产生相同的字符。

1
您需要输出记录分隔符 $,因为 xxfelixxx 已经回答了。
正如您所读的那样,$/输入记录分隔符。操作它可以影响Perl读取提供的文件数据的方式。例如:
open my $fh, "<", $filename or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;

由于我们已经重置了$/,所以上述代码将整个文件内容读入标量变量$content中。
考虑下面的代码:
#!/usr/bin/perl
use strict;
use warnings;
my $content;
{local $/; $content = <DATA>}
print "Content is $content";
__DATA__
line 1
line 2
line 3

输出:
Content is line 1
line 2
line 3

但是如果您不重置 $/,就像下面的代码一样:
#!/usr/bin/perl
use strict;
use warnings;
my $content = <DATA>;
print "Content is $content";
__DATA__
line 1
line 2
line 3

输出将为内容是第1行

这是因为输入记录分隔符被设置为换行符,并在第一行后返回。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接