我正在尝试编写一个将转换输入的 Perl 脚本
( name
( type ....
)
)
进入输出
( name ( type ... ) )
即所有这些匹配的行都( )
合并为一行,我想更新原始文件本身。
提前致谢
我正在尝试编写一个将转换输入的 Perl 脚本
( name
( type ....
)
)
进入输出
( name ( type ... ) )
即所有这些匹配的行都( )
合并为一行,我想更新原始文件本身。
提前致谢
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;
这是可行的,假设整个文件是一个大表达式。作为参考,要删除所有空格,请使用$new_format=~ s/\s//g;
代替$new_format=~ s/\n//g;
. 它可以很容易地修改以考虑多个表达式。所有人都必须重新定义$/
为您用来分隔表达式的任何内容(例如,如果只是一个空行local $/ = /^\s+$/;
:)并将所有内容都放入一个while循环中。对于每次迭代,将字符串推送到数组中,并在文件完全处理后,将数组的内容以您需要的格式写入文件。
这是另一种选择:
use strict;
use warnings;
while (<>) {
chomp unless /^\)/;
print;
}
用法:perl script.pl inFile [>outFile]
样本数据:
( name
( type ....
)
)
( name_a
( type_a ....
)
)
( name_b
( type_b ....
)
)
输出:
( name ( type .... ) )
( name_a ( type_a .... ) )
( name_b ( type_b .... ) )
该脚本将删除输入记录分隔符,除非读取的行包含最后一个右括号(与该行的第一个字符匹配)。
希望这可以帮助!
((..)) 语法有保证吗?如果是这样,我建议将整个内容合并为一行,然后根据 )(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 ....
)
)