如何摆脱此代码中的语法错误?

时间:2015-03-22 10:42:10

标签: perl

下面我将仅提供一个我想写的大量perl脚本。我在else语句中遇到语法错误但在控制台窗口中它只在perl脚本中说出语法错误而没有清楚地告诉错误。我正在尝试创建一个变量文件file_no_$i.txt并在其中复制t_code.txt的内容,然后使用一些选定的哈希值%defines_2

查找并替换变量文件中的字符串
open ( my $pointer, "<", "t_code.txt" ) or die $!;
my $out_pointer;    

 for (my $i=0 ; $i <=$#match  ; $i++) {
    for (my $j=0; $j <= $#match ; $j++) {          
       if ($match[$i]=~$match[$j]) {
              next;
            } 

     else {            
       my $file_name = "file_no_$i.txt";                                             
       open $out_pointer, ">" , $file_name  or die "Can't open the output file!";
       copy("$file_name","t_code.txt") or die "Copy failed: $!";
       my @lin = <$out_pointer>;
         foreach $_(@lin) {
      $_ =~ s/UART90_BASE_ADDRESS/$defines_2{ $_ = grep{/$match[$i]/} (keys %defines_2)};                              
                   }            
            }        
      }
}

2 个答案:

答案 0 :(得分:2)

您无法在/构造中使用s///未加引号。您可以使用不同的分隔符代替反斜杠:

s#UART90_BASE_ADDRESS#$defines_2{ $_ = grep{/$match[$i]/} (keys %defines_2)}#;

它修复了语法错误,但我担心它仍然无法执行您想要的操作。但是,如果没有数据,很难测试。

答案 1 :(得分:1)

我认为你正在做的是编辑一些名称看起来像file_no_1.txt等的文本文件。你是通过将当前文件复制到t_code.txt然后读取该文件行来实现的。按行,根据需要进行编辑,将行写回原始文本文件。

该方法的问题在于文件将被复制和重写多次,最好将整个文件读入数组,进行所有编辑,然后在一次操作中将其写回。除非文件很大 - 比如几GB,否则这样会很好。

这是实现该方法的一些代码。您看到$file_name已定义且@lines已填充内部循环中。最里面的循环修改@lines的元素,再次在该循环之外,@lines被写回原始文本文件。

我无法理解你的代码的一些事情。

  • 我不确定您是否应该使用=~,或者您打算使用简单的eq。前者执行了包含测试,过去你遇到了一个问题,你要检查第一个字符串是否在第二个结尾

  • grep电话

    grep{/$match[$i]/} (keys %defines_2)
    

    让我担心,因为它可能会返回%defines_2哈希的多个键,在这种情况下,您自己的代码将插入几乎是哈希元素的随机选择

如果您的代码正常工作那么这很好,但如果没有,那么我希望这可以帮助您解决问题。如果您需要更多关于此代码块的帮助,那么您应该包含一小部分数据样本,以便我们更好地了解正在发生的事情。

for my $i (0 .. $#match) {

  my $file_name = "file_no_$i.txt";

  my @lines = do {
    open my $in_fh, '<', 't_code.txt' or die $!;
    <$in_fh>;
  };

  for my $j (0 .. $#match) {

    next if $match[$i] =~ $match[$j];

    for ( @lines ) {
      my ($match) = grep { /$match[$i]/ } keys %defines_2;
      s/UART90_BASE_ADDRESS/$defines_2{$match}/;
    }
  }

  open my $out_fh, '>', $file_name or die qq{Can't open "$file_name" for output: $!};
  print $out_fh $_ for @lines;
  close $out_fh or die qq{Failed to close output file "$file_name": $!};
}