如何使用Perl的参数概念和子程序参数的访问元素?

时间:2015-04-27 08:25:04

标签: perl perl-data-structures

我正在编写一个用于调用子程序的代码,该子程序有4个参数(3个哈希值和1个文件处理程序)。我想知道如何在子程序中访问它们。我的代码如下。

#print OUTFILE "Content of TPC file:.\n";
my $DATA_INFO = $ARGV[0];
my $OUT_DIR = $ARGV[1];
my $log= "$OUT_DIR/log1";
open(LOG1,">$log");
require "$DATA_INFO";
my $SCRIPT_DIR = $ENV{"SCRIPT_DIR"} ; 
require "$SCRIPT_DIR/cmp_fault.pl";
require "$SCRIPT_DIR/pattern_mismatch.pl";
require "$SCRIPT_DIR/scan_count.pl";

print "\nComparing data:\n\n" ;
pattern_mismatch("\%data","\%VAR1","\%status",*LOG1);
cmp_fault("\%data","\%VAR1","\%status",*LOG1);
scan_count("\%data","\%status",*LOG1);
print "\n Comparison done:\n";

foreach $pattern (keys %status) {
 print "pattern";
  foreach $attr (keys %{$status{$pattern}}) {
   print ",$attr";
 }
 print "\n";
 last; 
 }    

 #Print Data
 foreach $pattern (keys %status) {
  print "$pattern";
 foreach $attr (keys %{$status{$pattern}}) {
  print ",$status{$pattern}{$attr}";

}     打印" \ n";

子例程cmp_fault在这里:

sub cmp_fault {
use strict;
use warning;
$data_ref= $_[0];;
$VAR1_ref= $_[1];
$status_ref = $_[2];
$log1_ref=$_[3];

 # print LOG1"For TPC : First find the pattern and then its fault type\n";

 for $pat ( keys %$data_ref ) {
  print  "fgh:\n$pat,";
  for $key (keys %{$data_ref{$pat}}) {
    if($key=~/fault/){
      print LOG1 "$key:$data_ref{$pat}{$key},\n";
       }
    }
}
 # print LOG1 "\nFor XLS : First find the pattern and then its pattern type\n";
  for $sheet (keys %$VAR1_ref){
   if ("$sheet" eq "ATPG") {
     for $row (1 .. $#{$VAR1_ref->{$sheet}}) {
       $patname = $VAR1_ref->{'ATPG'}[$row]{'Pattern'} ;
         next if ("$patname" eq "") ;
          $faultXls  = $VAR1_ref->{'ATPG'}[$row]{'FaultType'} ;
    #         print LOG1 " $patname==>$faultXls \n";
      if (defined $data{$patname}{'fault'}) {
      $faultTpc = $data{$patname}{'fault'} ;
     #     print LOG1 "\n $patname :XLS: $faultXls :TPC: $faultTpc\n";
          if("$faultXls" eq "$faultTpc") { 
           print LOG1 "PASS: FaultType Matched $patname :XLS: $faultXls :TPC: $faultTpc\n\n\n";
         print  "PASS: FaultType Matched $patname :XLS: $faultXls :TPC: $faultTpc\n\n";
         $status_ref->{$patname}{'FaultType'} = PASS;

        } 
       else {
          print LOG1 "FAIL: FaultType Doesn't Match\n\n";
       $status_ref->{$patname}{'FaultType'} = Fail;   
            }
       }
    }        
   }
  }
}
 return 1;

1 个答案:

答案 0 :(得分:0)

将参数传递给数组时,您只能传递一个参数列表。

对于标量,这不是问题。如果你所做的只是一个阵列,这也不是问题。

如果你需要发送标量和数组或散列,那么最简单的方法是首先“提取”标量参数,然后将“其他所有”视为列表。

use strict;
use warnings;

sub scalars_and_array {
    my ( $first, $second, @rest ) = @_;
    print "$first, $second, ", join( ":", @rest ), "\n";
}

scalars_and_array( "1", "2", "3", 4, 5, 6 );

但应该注意的是,通过这样做 - 你传递。你也可以用哈希来做到这一点。

要传递数据结构引用,请注意 - 通过引用传递,然后解除引用。但是要注意,->变得有用,因为它正在访问散列取消引用它。

use strict;
use warnings;
use Data::Dumper;

sub pass_hash {
    my ( $hashref ) = @_;
    print $hashref,"\n";
    print $hashref -> {"one"},"\n";
    print $hashref -> {"fish"} -> {"haddock"};
}


my %test_hash = ( "one" => 2,
                  "three" => 4, 
                  "fish" => { "haddock" => "plaice" }, );

pass_hash ( \%test_hash ); 
print "\n";
print Dumper \%test_hash;

你问题的核心在于,你没有打开strictwarnings这会告诉你:

for $pat ( keys %data_ref ) {

是错误的 - 没有名为data_ref的哈希,只有一个名为$data_ref的标量(包含哈希引用)。

您需要%$data_ref

在这里:

for $key ( keys %{ $data{$pat} } ) {

您也没有$data - 您的代码显示为$data_ref。 (你可能在范围内有%data,但在子内部进行混乱是一个非常糟糕的主意。

还有一堆其他错误 - strictwarnings也会显示错误。这是一个非常基本的调试步骤,如果您在寻求帮助之前执行此操作,通常会从Stack Overflow获得更好的响应。所以请 - 这样做,整理你的代码并删除错误/警告。如果您在此之后仍然遇到问题,那么请务必在帖子中列出您在哪里以及遇到什么问题。