所以我试图在配置中读取。 Perl中的文件。配置文件使用尾部反斜杠来表示行继续。例如,文件可能如下所示:
=== somefile ===
foo=bar
x=this\
is\
a\
multiline statement.
我有读取文件的代码,然后处理尾部反斜杠以连接行。但是,看起来Perl已经为我做了。例如,代码:
open(fh, 'somefile');
@data = <fh>;
print join('', @data);
打印:
foo=bar
x=thisisamultiline statement
瞧,'@ dat =;'语句似乎已经已经处理了尾部反斜杠!
这是Perl中定义的行为吗?
答案 0 :(得分:5)
我不知道你在看什么,但这不是有效的Perl代码,而且这不是Perl中的行为。下面是一些Perl代码可以执行您想要的操作:
#!/usr/bin/perl
use strict;
use warnings;
while (my $line = <DATA>) {
#collapse lines that end with \
while ($line =~ s/\\\n//) {
$line .= <DATA>;
}
print $line;
}
__DATA__
foo=bar
x=this\
is\
a\
multiline statement.
注意:如果您在命令行中输入文件,请执行以下操作:
perl -ple 1 <<!
foo\
bar
baz
!
然后你看到你的shell的效果,而不是Perl。考虑以下反例:
printf 'foo\\\nbar\nbaz\n' | perl -ple 1
答案 1 :(得分:5)
我的ConfigReader::Simple模块支持配置文件中的延续行,如果是您问题中的格式,则应该处理您的配置。
如果您想了解如何自己动手,请查看该模块的来源。这不是很多代码。
答案 2 :(得分:3)
我不知道你到底在做什么,但是你给我们的代码甚至没有运行:
=> cat z.pl
#!/usr/bin/perl
fh = open('somefile', 'r');
@data = <fh>;
print join('', @data);
=> perl z.pl
Can't modify constant item in scalar assignment at z.pl line 2, near ");"
Execution of z.pl aborted due to compilation errors.
如果我将片段更改为实际perl:
=> cat z.pl
#!/usr/bin/perl
open my $fh, '<', 'somefile';
my @data = <$fh>;
print join('', @data);
显然不会破坏数据:
=> perl z.pl
foo=bar
x=this\
is\
a\
multiline statement.
答案 3 :(得分:3)
Perl对您的数据不做任何事情,除非您告诉它。你做错了。请发布您的确切代码。