0

Perl を使用して、テキスト ファイルを解析していて、キーワードとファイル名を見つけたいのですが、そのファイルを開き (解析対象のファイルと同じディレクトリにあります)、そこからテキストを取得して挿入する必要があります。試合後。

file1 = 解析中のファイル

file2 = 含めるファイル

冒頭の 2 つのファイルの例:

file1
code code code
%include file2;
code code code

file2
(* a bunch of header information *)
function ( arg : type);

そして、後でfile1をどのように見せたいですか:

file1
code code code
(*%include file2;*)
(* a bunch of header information *)
function ( arg : type);
code code code

この置換を実行するための perl の開発に助けが必要です。

解析するファイルを取得して文字列として読み取る次の記述があります。この方法を使用してすでにいくつかの置換を実装しているため、この方法を維持したいと思いますが、残りはオープンシーズンです。私も物事を理解するのが好きなので、提出された解決策の簡単な説明を気にしないでいただければ幸いです.

#keep this part
open FILEHANDLE, "<", $file or die $!;
$string = do { local $/; <FILEHANDLE> };

#several other replace operations here already written
$string ~= s/match/replace;

#can rewrite this to be anything that works well
#match the include tag
if ($string =~ m/^%include\s+'(\w+).(PRO)'/gi)
{
  #build the replace string
  my $includefile = $1.'.'.$2;
  my $replacestring = "(* $& *) \n";
  open my INCLUDEHANDLE, "<", $includefile or die $!;
  $replacestring += do { local $/; <INLCUDEHANDLE> }

  # I am lost at this point
}

#this is dirty but it works
#close file for read
close FILEHANDLE;
#open file for write
open FILEHANDLE, ">", $file or die $!;
print FILEHANDLE $string;
#close file for write
close FILEHANDLE;

ファイルの読み取り/書き込み操作をクリーンアップし、file2 の内容を (* ヘッダー情報 *) から削除してから file1 に書き込むためのインターネット仲間:

file1
code code code
(*%include file2*)
function ( arg : type);
code code code
4

2 に答える 2

0

複雑なマッチを行う必要がない限り、ワンライナーで間に合わせることができます。

perl -pi.bak -lwe'$x=qx(cat rep.txt); s/(%include file2;)/(*$1*)$x/g' file1.txt

これにより、ファイル全体「rep.txt」が に読み込まれ$x、一致後に挿入されます。

qx()どちらがシステム コールであり、移植性がないことに依存するのは最適ではありません。開ループを書く方が良いでしょう。

于 2012-10-18T16:31:30.813 に答える
0

あなたのファイルが丸呑みできるほど小さい場合、あなたのタスクはただの派手な文字列の置換です:

use strict;
use warnings;

# function to replace the match with a string (slurped from
# a file mentioned in group)
sub magic_replace {
    my ($m, $g) = @_;
    sprintf "(%s)\nPlease slurp this from '%s'", $m, $g;
}

my $s =<<'EOF'
I should have
slurped
%include file2.ext2;
this from
%include file3.ext3;
file1.ext1
EOF
;

print "---------\n", $s, "---------\n";

$s =~ s/(%include\s([^;]+);)/
   magic_replace($1, $2)
   /egx;

print "---------\n", $s, "---------\n";

出力:

perl 12959116.pl
---------
I should have
slurped
%include file2.ext2;
this from
%include file3.ext3;
file1.ext1
---------
---------
I should have
slurped
(%include file2.ext2;)
Please slurp this from 'file2.ext2'
this from
(%include file3.ext3;)
Please slurp this from 'file3.ext3'
file1.ext1
---------

置換操作に「コールバック」関数を使用すると、置換の作成 (スラーピングと) に集中でき、内部ですべてのループを実行できます。

(私たちの両方の正規表現パターンは、いじくり回す必要があるかもしれません - あなたのドット、偽の空白の私の怠慢。)

更新(コメントで質問を書く)

パターンに「^」を追加する場合は、m 修飾子を適用する必要があります。

于 2012-10-18T17:55:42.683 に答える