0

我有一个配置文件,格式非常简单:

# comment
key = value

这是我在输入循环中编写的内容,用于在拆分键值之前忽略不需要的行:

while (<C>) {
    chomp;
    # ignore all comments, blank lines or other wrongly formatted lines
    # so that we are only left with key = value
    next unless /(?<!#)\s*\w+\s*=\s*\w+/;

我的问题:这是否足以满足忽略不需要的行的需要,还是我遗漏了什么?

更新:我的问题是关于我的next unless...陈述是否涵盖所有不需要的情况。我知道对于完成配置解析的最佳方式有不同的理念。

4

3 回答 3

1

这可能是你想要的。配置将设置为 hash %conf。(您不必使用split。)

while(<C>) {
  chomp;

  # Skip comment
  next if /^#/;

  # Process configuration
  if(/^(\w+)\s*=\s*(.*)/) {
    ($key, $value) = ($1, $2);
    $conf{$key} = $value
  } else {
    print STDERR "Invalid format: $_\n";
  }
}
于 2012-12-10T15:56:47.960 回答
0

我最近才这样做:

while (my $line = <$fh>) {
    next if $line =~ /^\s*$/; # skip empty lines
    next if $line =~ /^\s*#/; # skip lines that are only comments

    # both sides of the '=' must contain alphanumeric characters
    if ($line != /^\s*\w+\s*=\s*\w+/) { warn "Invalid format in line $.\n" }

    # split by '=', producing a maximum of two items;
    # the value may contain whitespace
    my ($key, $value) = split '=', $line, 2;

    foreach ($key, $val) {
        s/\s+$//; # remove trailing whitespace
        s/^\s+//; # remove leading whitespace
    }

    # store in a hash or whatever you like
    $config{$key} = $value;

我喜欢它,因为它允许非常灵活的配置文件。

于 2012-12-10T17:12:18.133 回答
0

你可以简单地做:

while (<C>) {
    chomp;

    # if you only want to skip comments ( lines starting with # )
    # then you could just specify it directly 
    next if $_ =~ m/\A#/;

}

使用“除非”会使事情复杂化,因为您说“除非它不是评论”,这可能意味着很多事情。如果您只使用“if”,您可以直接指定您正在跳过注释行。

您可能不清楚的事情: - $_ 是文件的当前行。- 正则表达式中的 \A 表示行首。

正则表达式匹配所有以 # 开头的行。

于 2012-12-10T15:48:54.167 回答