我正在开发一个perl脚本,该脚本可基于命令行参数生成Verilog模板。为此,我需要在循环中将相同的标头写入多个文件。这是我的代码。
format MODULE_TOP=
// --------------------------------------------------------------------
// RELEASE HISTORY
// VERSION DATE AUTHOR DESCRIPTION
// @<<<<<< @<<<<<<<<<<<<<< @<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
$VERSION,$DATE,$AUTHOR,$DESCRIPTION
// --------------------------------------------------------------------
// KEYWORDS :
// --------------------------------------------------------------------
// PURPOSE :
// --------------------------------------------------------------------
.
format MODULE=
module @<<<<<< (
$module_name
);
//signal declarations
//main body of the module
endmodule
foreach (@modules) {
$file_name = "$_.v";
open MODULE,'>',$file_name or die "$!";
$FILENAME = $file_name;
$module_name = $_;
write MODULE;
close MODULE;
}
但是标题仅写入第一个文件,其余模块仅包含主体。有什么办法可以在所有文件中写入标头。
答案 0 :(得分:1)
这不是将标头写入每个文件,因为关闭并重新打开MODULE
句柄不会重置$-
($FORMAT_LINES_LEFT
和use English;
),即跟踪当前页面中剩余多少行。如果每次使用新文件重新打开文件句柄时将该变量重置为0,它将使格式重置为新页面。从文档中尚不清楚,但是您 ALSO 必须在执行此操作之前重新select
。重用文件句柄很棘手。使用自动复制的样式而不是裸露的句柄是一种很好的样式的众多原因之一(尽管这不能使您不必在使用格式时使用select
)。
#!/usr/bin/perl
use warnings;
use strict;
use autodie;
our $file;
format FOO_TOP =
Header line
-----------
.
format FOO =
Body of @<<<<<<
$file
.
for $file ("a.txt", "b.txt") {
open FOO, ">", $file;
my $oldfd = select FOO;
$- = 0;
select $oldfd;
write FOO;
close FOO;
}
上面的循环可以用更现代的样式编写,如下所示:
for $file ("a.txt", "b.txt") {
open my $foo, ">", $file;
my $oldfd = select $foo;
$^ = "FOO_TOP";
$~ = "FOO";
select $oldfd;
write $foo;
close $foo;
}
另一种更简洁的方法是使用IO::Handle模块中的方法:
for $file ("a.txt", "b.txt") {
open FOO, ">", $file;
format_lines_left FOO 0;
write FOO;
close FOO;
}
或
for $file ("a.txt", "b.txt") {
open my $foo, ">", $file;
$foo->format_name("FOO");
$foo->format_top_name("FOO_TOP");
write $foo;
close $foo;
}
为您进行select
包装。