入力を変換する Perl スクリプトを作成しようとしています。
( name
( type ....
)
)
出力に
( name ( type ... ) )
つまり、一致するこれらの行はすべて( )
1 行にマージされ、元のファイル自体を更新したいと考えています。
前もって感謝します
入力を変換する Perl スクリプトを作成しようとしています。
( name
( type ....
)
)
出力に
( name ( type ... ) )
つまり、一致するこれらの行はすべて( )
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 ループにスローする必要があります。反復ごとに文字列を配列にプッシュし、ファイルの処理が完了したら、配列の内容を必要な形式でファイルに書き込みます。
((..)) 構文は保証されていますか? もしそうなら、全体を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 ....
)
)