代码之家  ›  专栏  ›  技术社区  ›  Vihaari Varma

如何在一个循环中将Perl格式的头文件写入多个文件中

  •  0
  • Vihaari Varma  · 技术社区  · 6 年前

    我正在开发一个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; 
    }
    

    但是头文件中只写第一个文件,其余的模块只包含正文。是否有任何方法可以在所有文件中写入头文件?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Shawn    6 年前

    因为关闭并重新打开 MODULE 手柄不复位 $- ( $FORMAT_LINES_LEFT 具有 use English; )跟踪当前页中还剩多少行的变量。如果每次用新文件重新打开文件句柄时都将该变量重置为0,则会使格式重置为新页。文件上不清楚,但你 产科加强生命支持 必须重新- 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;
    }
    

    哪个做的 选择 为你包装。