gpt4 book ai didi

perl - 我如何进行模式匹配并继续写入新文件直到另一个模式匹配

转载 作者:行者123 更新时间:2023-12-02 07:26:31 25 4
gpt4 key购买 nike

我的目标是查找“big.v”文件中从模式匹配“module”到“endmodule”的所有行并将其打印到各个文件中。

big.v: module test;
<bunch of code>
endmodule
module foo;
<bunch of code>
endmodule

单个文件看起来像:

test.v : module test;
..
endmodule

foo.v: module test1;
..
endmodule

我的大部分工作使用:

use strict;
use warnings;

#open(my $fh, ">", $f1) || die "Couldn't open '".$f."' for writing because: ".$!;

while (<>) {
my $line = $_;
if ($line =~ /(module)(\s+)(\w+)(.*)/) {
my $modname = $3;
open(my $fh1, ">", $modname.".v") ;
print $fh1 $line."\n";
## how do i keep writing next lines to this file until following pattern
if ($line =~ /(endmodule)(\s+)(.*)/) { close $fh1;}
}
}

谢谢,

最佳答案

有一个有用的 perl 构造称为“范围运算符”: http://perldoc.perl.org/perlop.html#Range-Operators

它是这样工作的:

while ( <$file> ) {
if ( m/startpattern/ .. m/endpattern/ ) {
print;
}
}

所以给出你的例子 - 我认为这应该可以解决问题:

my $output; 
while ( my $line = <STDIN> ) {
if ( $line =~ m/module/ .. m/endmodule/ ) {
my ( $modname ) = ( $line =~ m/module\s+(\w+)/ );
if ( defined $modname) {
open ( $output, ">", "$modname.v" ) or warn $!;
}
print {$output} $line;
}
}

编辑:但是考虑到您的源数据 - 我认为您实际上不需要使用范围运算符。您可以随时关闭/重新打开新的“输出”文件。这假设您可以根据“模块”行“分割”您的文件,这不一定是一个有效的假设。

但更像这样:

use strict;
use warnings;

open ( my $input, "<", "big.v" ) or die $!;

my $output;
while ( my $line = <$input> ) {
if ( $line =~ m/^\s*module/ ) {
#start of module line found

#close filehandle if it's open
close($output) if defined $output;

#extract the module name from the line.
my ($modulename) = ( $line =~ m/module\s+(\w+)/ );

#open new output file (overwriting)
open( $output, ">", "$modulename.v" ) or warn $!;
}
#this test might not be necessary.
if ( defined $output ) {
print {$output} $line;
}
}

关于perl - 我如何进行模式匹配并继续写入新文件直到另一个模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28097238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com