Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl使用子例程参数的引用概念和访问元素?_Perl_Perl Data Structures - Fatal编程技术网

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

如何使用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

我正在编写一个调用子例程的代码,它有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{"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} } ) {