2013-12-12 171 views
-1

我试图通过文件解析并收集不同模块中的不匹配类型并生成一个xls。以下是报告模式我需要解析(但实际的报告模式不是简单如下):使用perl和字符串连接解析文件

outsocket ports in design1 not in design2 
a 
b 
Insocket ports in design1 not in design2 
g 
h 

可以有很多花样名(推到模块使用$module列表)在日志中,但这种格局将(在<>中的Insocket/outsocket /其他端口不在<>

下面是我的核心代码。我遇到了这个代码的问题,并且它不能正常工作(尤其是字符串连接),请帮助我修复这个。

while ($line = <FH>) { 
    if ($line =~ /Insocket(\s*)ports(\s*)in(\s*)${design1}(\s*)not(\s*)in(\s*)${design2}/) { 
     $mismatch_type = "type_i_n"; 
    } 
elsif ($line =~ /Insocket(\s*)ports(\s*)in(\s*)${design2}(\s*)not(\s*)in(\s*)${design1}/) { 
     $mismatch_type = "type_i_r"; 
    } 

elsif ($line =~ /outsocket(\s*)ports(\s*)in(\s*)${design2}(\s*)not(\s*)in(\s*)${design1}/) { 
     $mismatch_type = "type_o_n"; 
    } 

elsif ($line =~ /outsocket(\s*)ports(\s*)in(\s*)${design1}(\s*)not(\s*)in(\s*)${design2}/) { 
     $mismatch_type = "type_o_r"; 
    } 

     $result = $mismatch_type . "_code_ " . $module; 
     $$result = $$result .$line; 
     if(!present_in_list ($module,@module_list)) { 
      push @module_list,$module; 
     } 
     push @mismatch_type_list,$mismatch_type; 
}#PARSING OF FILE ENDS 


#NOW PROCESSING THE RESULTS BASED ON PARSING 
foreach $module (@module_list) { 
     foreach $each_mismatch (@mismatch_type_list) { 
      $result = $mismatch_type . "_code_ " . $module; 
      print FH2" $$result,"; 
                            } 
    } 
+0

你能否阐述一下代码是如何不工作?该计划的结果如何,您是如何期望它的工作方式不同?由于这是一个不完整的程序,我们对你正在处理什么类型的数据只有非常宽松的想法,所以很难猜测你可能需要什么。 –

+0

你真的应该使用正确的缩进。这将有助于您的节目很多。 – TLP

+0

我试图在解析期间将每个不匹配类型($ mismatch_type)与模块($ module)关联,并最终从我的列表中获取每个模块并显示相关联的行($ line),这些行在解析期间在解析期间连接在一起 – user274739

回答

0

这里有几个猜测和一般建议。我不知道这将解决你的问题,但它可能会帮助:

  1. 前两个正则表达式中${design1}}${design2}}有一个额外的}。不确定这是否存在于您的原始程序中,或者是否在此处发布时引入了错误。

  2. 它看起来像你使用字符串连接,建立一个$result变量的名称,这样,那么你可以使用该字符串作为另一变量像$type_i_n_code_module_a名称。我强烈建议,以减少混乱,您使用的哈希来代替:

    %result =(); 
    while ($line = <FH>) { 
        ... 
        $result_key = $mismatch_type . "_code_ " . $module; 
        $result{$result_key} = $result{$result_key} . $line; 
    } 
    
    ... 
    foreach $module (@module_list) { 
        foreach $each_mismatch (@mismatch_type_list) { 
         $result_key = $mismatch_type . "_code_ " . $module; 
         print FH2" $result{$result_key},"; 
        } 
    } 
    
+0

额外}是因为错字。你可以让我知道为什么我的代码不工作,并提供一些关于散列解释的细节。 – user274739

+0

我不知道为什么你的代码不工作,因为你没有说它实际上在做什么,你没有向我们显示导致它行为的输入。所以我所能做的只是猜测。至于散列:散列是其他语言中也称为“关联数组”或“字典”的变量。它将任意键映射到值,所以如果你的哈希变量是'%result',那么你可以有'$ result {'type_i_n_code_module'} ='abcde''和'$ result {'type_o_r_code_module'} ='fghij''等等上。这是一个更清洁的解决方案,以不同的变量保存文件的不同部分。 –

+0

如果你不熟悉这些数据结构,['perldata'手册页](http://perldoc.perl.org/perldata.html)是阅读哈希以及如何使用它们的好地方。 –