0

入力を変換する Perl スクリプトを作成しようとしています。

( name  
  ( type ....  
  )  
)  

出力に

( name  ( type ... ) )

つまり、一致するこれらの行はすべて( )1 行にマージされ、元のファイル自体を更新したいと考えています。

前もって感謝します

4

3 に答える 3

1
use strict;
use warnings;

my $file="t.txt"; #or shift (ARGV); for command line input
my $new_format=undef;

open READ, $file;
local $/=undef; #says to read to end of file

$new_format=<READ>;
$new_format=~ s/\n//g; #replaces all newline characters with nothing, aka removes all \n

close(READ);

open WRITE, ">$file"; #open for writing (overwrites)
print WRITE $new_format;
close WRITE;

これは、ファイル全体が 1 つの大きな式であると仮定して機能します。参考までに、すべての空白を削除するには、$new_format=~ s/\s//g;代わりに を使用し$new_format=~ s/\n//g;ます。複数の式を考慮して簡単に変更できます。$/式を区切るために使用しているもの(たとえば、単に空白行の場合)になるように再定義しlocal $/ = /^\s+$/;、すべてを while ループにスローする必要があります。反復ごとに文字列を配列にプッシュし、ファイルの処理が完了したら、配列の内容を必要な形式でファイルに書き込みます。

于 2013-05-10T20:52:31.653 に答える
0

((..)) 構文は保証されていますか? もしそうなら、全体を1行にマージしてから、に基づいて分割することをお勧めします )(s.

my $line = ""; 
while(<DATA>) 
{ 
 $_ =~ s= +$==g;  # remove end spaces.
 $line .= $_; 
}
$line =~ s=\n==g;
my @lines = split /\)\(/,$line;
my $resulttext = join ")\n(", @lines; 
print $resulttext;



__END__

( name  
 ( type ....    
 )  
)  
( name2   
  ( type2 ....  
  )  
)    
( name3  
 ( type3 ....  
 )  
)  
于 2013-05-10T20:29:19.683 に答える