2015-04-27 2 views
-1

Я пишу код для вызова подпрограммы, которая имеет 4 аргумента (3 хэша и один обработчик файлов). I хочу знать, как получить к ним доступ в подпрограмме. Мой код выглядит следующим образом.Как использовать концепцию refernce и элемент доступа аргумента подпрограммы с помощью Perl?

#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}"; 

} печать "\ п";

Sub рутина 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; 
+2

* Always * 'use strict; использовать предупреждения; '! – Biffen

+0

Ohk thankkxx для ответа .... i vl использовать его. Но как получить доступ к этому 3 хешу в подпрограмму –

+1

Это не самая большая проблема с вашим кодом, который, откровенно говоря, немного беспорядок. Вы получаете доступ к переменным, которые не определены/в области видимости. «Строгие» и «Предупреждения» расскажут вам об этом. – Sobrique

ответ

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, если вы это сделаете, прежде чем обращаться за помощью. Поэтому, пожалуйста, сделайте это, уберите свой код и удалите ошибки/предупреждения. Если у вас все еще есть проблемы после этого, тогда обязательно опубликуйте, где и какие проблемы у вас есть.

+0

Большое вам спасибо за ваш ответ.Я получил очень хорошие подсказки, но после того, как я заменил $ data_ref на% $ data_ref, теперь эта подпрограмма совсем не работает. Возможно, что-то неточно перепрограммировать переменную «$ VAR1» в/project/ls1socdft/user/pooja/test_plan_checker/dfta/perl/pattern_qa/script/cmp_fault.pl строка 23. другие ошибки. Я получаю предупреждение так: « –

+0

Эта ошибка означает, что вы используете' $ VAR1', когда она не определена. Это правда. имеют '$ VAR_ref' и NO' $ VAR1' в пределах вашего юнита. Perl не магически переводит между ними. Это, в свою очередь, означает - вы должны включать 'strict' и' warnings' и исправлять ошибки в вашем коде, потому что они почти наверняка, почему у вас проблемы. – Sobrique

+0

теперь я активировал строгую, предупреждал и менял, что var1 в var1_ref.Но проблема. –

 Смежные вопросы

  • Нет связанных вопросов^_^