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 (<C>) {
    chomp;

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

}

「unless」を使用すると、多くのことを意味する可能性がある「unless it is not a comment」と言っているため、複雑になります。「if」のみを使用する場合、コメント行をスキップすることを直接指定できます。

不明な点: - $_ はファイルの現在の行です。- 正規表現内の \A は行頭を意味します。

正規表現は、先頭に # があるすべての行に一致します。

于 2012-12-10T15:48:54.167 に答える
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 に答える