0

我正在尝试编写一个将转换输入的 Perl 脚本

( name  
  ( type ....  
  )  
)  

进入输出

( name  ( type ... ) )

即所有这些匹配的行都( )合并为一行,我想更新原始文件本身。

提前致谢

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;

这是可行的,假设整个文件是一个大表达式。作为参考,要删除所有空格,请使用$new_format=~ s/\s//g;代替$new_format=~ s/\n//g;. 它可以很容易地修改以考虑多个表达式。所有人都必须重新定义$/为您用来分隔表达式的任何内容(例如,如果只是一个空行local $/ = /^\s+$/;:)并将所有内容都放入一个while循环中。对于每次迭代,将字符串推送到数组中,并在文件完全处理后,将数组的内容以您需要的格式写入文件。

于 2013-05-10T20:52:31.653 回答
0

这是另一种选择:

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 ....    )  )

该脚本将删除输入记录分隔符,除非读取的行包含最后一个右括号(与该行的第一个字符匹配)。

希望这可以帮助!

于 2013-05-12T03:38:35.050 回答
0

((..)) 语法有保证吗?如果是这样,我建议将整个内容合并为一行,然后根据 )(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 回答