我正在编写一个用于调用子程序的代码,该子程序有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";
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;
答案 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;
你问题的核心在于,你没有打开strict
和warnings
这会告诉你:
for $pat ( keys %data_ref ) {
是错误的 - 没有名为data_ref
的哈希,只有一个名为$data_ref
的标量(包含哈希引用)。
您需要%$data_ref
。
在这里:
for $key ( keys %{ $data{$pat} } ) {
您也没有$data
- 您的代码显示为$data_ref
。 (你可能在范围内有%data
,但在子内部进行混乱是一个非常糟糕的主意。
还有一堆其他错误 - strict
和warnings
也会显示错误。这是一个非常基本的调试步骤,如果您在寻求帮助之前执行此操作,通常会从Stack Overflow获得更好的响应。所以请 - 这样做,整理你的代码并删除错误/警告。如果您在此之后仍然遇到问题,那么请务必在帖子中列出您在哪里以及遇到什么问题。