如何使用Perl使用子例程参数的引用概念和访问元素?
我正在编写一个调用子例程的代码,它有4个参数(3个散列和一个文件处理程序)。我想知道如何在子例程中访问它们。我的代码如下如何使用Perl使用子例程参数的引用概念和访问元素?,perl,perl-data-structures,Perl,Perl Data Structures,我正在编写一个调用子例程的代码,它有4个参数(3个散列和一个文件处理程序)。我想知道如何在子例程中访问它们。我的代码如下 #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{"SCR
#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_故障如下:
将参数传递到数组中时,只能传递单个参数列表 对于标量,这不是问题。如果您只处理一个数组,那么这也不是问题 如果需要发送标量和数组或散列,那么简单的方法是首先“提取”标量参数,然后将“其他所有内容”作为列表处理
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;
不过,这里的核心问题是,您没有启用严格
和警告
,这会告诉您:
for $pat ( keys %data_ref ) {
错误-没有名为data\u ref
的散列,只有名为$data\u ref
的标量(包含散列引用)
这里需要%$data\u ref
在这里:
for $key ( keys %{ $data{$pat} } ) {
您也没有$data
-您的代码显示$data\u ref
。(范围内可能有%数据
,但在子范围内处理这是一个非常糟糕的主意)
还有一系列其他错误,
strict
和warnings
也会显示这些错误。这是一个非常基本的调试步骤,如果在请求帮助之前执行此操作,通常会从堆栈溢出中获得更好的响应。因此,请-这样做,整理您的代码并删除错误/警告。如果你在那之后仍然有问题,那么一定要写一篇文章,概述你在哪里遇到的问题以及你遇到的问题 始终严格使用;使用警告代码>!Ohk感谢Kxx的回复…我会使用它。但是如何将3个散列访问到子例程这不是你代码的最大问题,坦白说,这有点混乱。您正在访问范围中未定义的变量strict
和warnings
会告诉你这些。非常感谢你的回复。我得到了非常好的提示,但是在将$data\u ref回复到%$data\u ref之后,现在子例程根本不起作用。你能解释一下变量“$VAR1”吗未在/project/ls1socdft/user/pooja/test\u plan\u checker/dfta/perl/pattern\u qa/script/cmp\u fault.pl第23行导入。其他错误。我收到如下警告“该错误意味着-您正在使用未定义的$VAR1
。这是真的。因为您的sub中有$VAR\u ref
,并且没有$VAR1
。Perl不会神奇地在两者之间转换。这反过来意味着-您应该打开strict
和warnings
并修复代码中的错误,因为它们几乎肯定是您出现问题的原因。现在我已激活strict,warnings并将该var1更改为var1\u ref。但仍然存在问题。好的。如果您仍然有问题,请重新发布您的新代码并突出显示您遇到的困难。否。启用严格
和警告
。先把它们修好。
for $key ( keys %{ $data{$pat} } ) {