1

ここで私の他の質問に続いて..

Web ページの内容を 1 行ずつ読み取り、特定のパターンとの一致を試み、一致した場合はファイルに書き込む次のコードがあります。

foreach my $line (split qr/\R/, $mech->content) {
    if ($line=~ m/t\/([A-Z]+)/){
        print $fileHandle "$1\n";
    }
}

一致する行を別の複数行変数に追加して、ループが終了したときにのみファイルに書き込むことができるかどうか疑問に思います。

そのようにしたい理由は、直接行うのではなく、次のサブルーチンを使用してデータをファイルに保存したいからです。

writeToFile("fileName.tmp","path",data);

これは私が書いたサブルーチンで、データをファイルに保存するだけでなく、次のチェックも行います。

  1. 指定されたパスが既に存在するか (必要に応じて作成するか)
  2. ファイルがディスク上に既に存在する場合は、これから書き込まれるファイルと比較します (ファイルが異なる場合にのみ書き込みます)。

したがって、この追加の変数を作成できれば、ディスクに書き込むファイルが 1 つ少なくなります。

4

3 に答える 3

4
  1. 文字列の連結によってそれを行うことができます。ループ内では、 print を置き換えるだけです

    $data .= "$1\n"; 
    # Same as $data = $data . "$1\n";
    
  2. または、Perl の魔法を使用して、ループや:mapを使用せずに複数行の文字列を作成します。if

    my $data = join "", 
                    map { /t\/([A-Z]+)/ ? "$1\n" : "" } 
                    split(qr/\R/, $mech->content);
    
  3. または、分割して結合するという苦痛を経験する必要さえありません。

    複数行の文字列を単一の文字列として扱い (/g修飾子を使用すると、正規表現を何度も一致させることができます)、ループ全体を 3 行だけに置き換えます。

    my $data = $mech->content();
    $data =~ s/t\/([A-Z]+)/$1\n/g;
    writeToFile("fileName.tmp", "path", $data);
    
于 2013-03-28T20:17:22.120 に答える
1

簡単です-演算子を使用して文字を追加できます.=(これは代入(=)と連結()を組み合わせたものです.

my $data = "";
while (my $line = ...) {
    ...
    $data .= $line . "\n";
}
writeToFile("fileName.tmp", "path", $data);
于 2013-03-28T20:13:58.650 に答える
1

交換するだけ

open(my $fileHandle, ...) or ...;

...

   print $fileHandle "$1\n";

my $data = '';

...

   $data .= "$1\n";

出力をファイルハンドルに送信する代わりに、文字列に追加します。

于 2013-03-28T20:19:23.320 に答える