3

次の形式のファイルがあります

 location:
 rome

 participants:
 cesar
 pompei
 Sylla

そして、キーを指定して値を取得するために呼び出しようとperlしています。たとえば、パラメーターを持つ関数は次のようになりますparticipants

 cesar
 pompei
 Sylla

私が直面している問題は、オプションが-nないと、私の正規表現が機能しないように見えることです。たとえば、私は期待していました

> perl -e '/(.*)/ms && print "$1\n" ' input.txt

ドキュメント全体を印刷します。

4

4 に答える 4

4

コマンドラインで、段落モードを使用することもできます。

perl -MData::Dumper -00 -anlwe 
    '$h=shift @F; $a{$h}=[@F]; }{ print Dumper \%a;' ceasar.txt

出力:

$VAR1 = {
          'participants:' => [
                               'cesar',
                               'pompei',
                               'Sylla'
                             ],
          'location:' => [
                           'rome'
                         ]
        };

説明:

  • -MData::DumperData::Dumperモジュールを使用します。これはデモンストレーション用であり、質問とは関係ありません。
  • -00段落モードを使用します。これは、入力レコードの区切り文字を\n\nに設定して、入力が2つの改行で分割されるようにすることを意味します。
  • -a空白で段落を分割します。これをで修飾して-F'\n'、改行でのみ分割することができます。
  • -nプログラムの周りの暗黙while (<>)のループ。
  • -lこの例では厳密には必須ではありませんが、便利な方法で改行の末尾を処理します。
  • @Fautosplitオプションが使用する配列です。つまり、段落の最初の単語をヘッダーにし、残りの単語を引数にします。
于 2012-11-13T20:29:27.783 に答える
2

デフォルト-n-pは、入力は一度に1行ずつ1行のスクリプトに送られます。したがって、複数行の検索perlを使用するには、別のレコード区切り文字を使用するように指示する必要があります。-0そのためのオプションを使用してください。

ファイル全体を1行で読み取るには:

perl -0777 -ne '...' input.txt

「段落モード」を使用するには(2つ以上の連続した改行で分割します。これは、この問題に必要な場合があります)。

perl -00 -ne '...' input.txt
于 2012-11-13T19:07:21.107 に答える
1

-nを使用していない場合は、入力を明示的に読み取る必要があります。

while(<>){do...}

stdinから実際に何も読み取っていないため、一致するものはありません。

于 2012-11-13T18:37:35.670 に答える
1

このalitleをテストしました:

# cat file
location:
rome

participants:
cesar
pompei
Sylla

今すぐ入手participants

# perl -e 'undef $/; $_=<>; /participants:\s*(.*?)(\n\n|$)/s && print "$1\n";' file
cesar
pompei
Sylla

UPD:TLPで述べたように、-0スイッチで書き換えることができます。

# perl -0777 -e '$_=<>; /participants:\s*(.*?)(\n\n|$)/s && print "$1\n";' file
cesar
pompei
Sylla
于 2012-11-13T19:07:01.523 に答える