在Perl中,如何处理配置文件中的延续行?

时间:2009-09-04 14:43:53

标签: perl configuration

所以我试图在配置中读取。 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中定义的行为吗?

4 个答案:

答案 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对您的数据不做任何事情,除非您告诉它。你做错了。请发布您的确切代码。