Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl脚本中合并两行_Perl_Perl Module - Fatal编程技术网

如何在perl脚本中合并两行

如何在perl脚本中合并两行,perl,perl-module,Perl,Perl Module,我正在尝试编写一个Perl脚本来转换输入 ( name ( type .... ) ) 输入到输出中 ( name ( type ... ) ) 也就是说,所有匹配()的行都合并到一行中,我想更新原始文件本身 提前感谢是否保证((..)语法?如果是这样的话,我建议将整件事合并成一行,然后根据(s)进行拆分 my$line=”“; while() { $\uz=~s=+$==g;#删除结束空格。 $line.=$\ux; } $line=~s=\n==g; my@l

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

( name  
  ( type ....  
  )  
)  
输入到输出中

( name  ( type ... ) )
也就是说,所有匹配
()
的行都合并到一行中,我想更新原始文件本身

提前感谢

是否保证((..)语法?如果是这样的话,我建议将整件事合并成一行,然后根据(s)进行拆分

my$line=”“;
while()
{ 
$\uz=~s=+$==g;#删除结束空格。
$line.=$\ux;
}
$line=~s=\n==g;
my@lines=split/\)\(/,$line;
my$resulttext=join“)\n(“,@行;
打印$resulttext;
__结束__
(姓名)
(键入…)。。。。
)  
)  
(姓名2)
(第2类…)。。。。
)  
)    
(姓名3)
(第3类…)。。。。
)  
)  
严格使用;
使用警告;
my$file=“t.txt”#或shift(ARGV);用于命令行输入
我的$new_格式=未定义;
打开读取文件;
本地$/=undf;#表示读取到文件末尾
$new_format=;
$new_format=~s/\n//g;#用零替换所有换行符,aka删除所有换行符\n
关闭(读取);
打开写入,“>$file”#打开写入(覆盖)
打印写入$new_格式;
闭合写入;
假设整个文件都是一个大表达式,那么这是可行的。作为参考,要删除所有空白,请使用
$new\u format=~s/\s//g;
而不是
$new\u format=~s/\n//g;
。它可以很容易地修改,以考虑多个表达式。所有这些操作都必须重新定义
$/
,以使其成为用于分离的任何内容ate表达式(例如,如果只是一个空行:
local$/=/^\s+$/;
)并将所有内容放入while循环。对于每次迭代,将字符串推入数组,在文件完成处理后,以所需格式将数组内容写入文件。

这里是另一个选项:

use strict;
use warnings;

while (<>) {
    chomp unless /^\)/;
    print;
}
输出:

( name    ( type ....    )  )
( name_a    ( type_a ....    )  )
( name_b    ( type_b ....    )  )
脚本将删除输入记录分隔符,除非读取的行包含最后一个右结束符(与行上的第一个字符匹配)


希望这有帮助!

这是4行。看起来您只是想将换行符转换为空格。您可能需要查看核心模块,尽管对于您当前的问题来说,这可能有点过头了。我相信我的回答应该可以帮助您解决问题。如果在4行集合中有注释交错,您必须小心,如containi行中的注释NG<代码>(名称<代码> >。我用C++做了一些类似的事情,必须确保引导代码<>代码///<代码>没有结束在合并行的中间。
use strict;
use warnings;

while (<>) {
    chomp unless /^\)/;
    print;
}
( name  
  ( type ....  
  )  
)
( name_a  
  ( type_a ....  
  )  
)
( name_b  
  ( type_b ....  
  )  
)
( name    ( type ....    )  )
( name_a    ( type_a ....    )  )
( name_b    ( type_b ....    )  )