Chinaunix

标题: 怎么判断hash中指定的结构是否存在? [打印本页]

作者: lybpyn    时间: 2011-11-09 15:20
标题: 怎么判断hash中指定的结构是否存在?
if ( exists $conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->[$m]->{'measResults'})


这样写对吗?
作者: x9x9    时间: 2011-11-09 15:23
试着运行一下就可以了啊~
作者: lybpyn    时间: 2011-11-09 15:43
回复 2# x9x9


    但是报错说 Not  an ARRAY reference at   line  43
作者: sosflyer    时间: 2011-11-09 15:47
回复 3# lybpyn


    那你就看看你创建这个数据结构的时候是不是错了啊
作者: lybpyn    时间: 2011-11-09 15:49
回复 4# sosflyer


    结构是因为有些地方有这个结构  有些地方没这个结构  所以才要作判断是不是存在
作者: sosflyer    时间: 2011-11-09 15:56
回复 5# lybpyn


    我就是说,在你程序中有这个结构的地方,你向这个结构保存数据的时候是不是按照这个结构来的。
作者: ludio333    时间: 2011-11-09 15:58
常用Data:umper看看吧
作者: lybpyn    时间: 2011-11-09 16:01
回复 6# sosflyer


    我是从xml文件里提取数据  但是xml文件里有些存在$conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->[$m]这个结构有些就只有$conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}这个结构 所以我想判断一下
作者: lybpyn    时间: 2011-11-09 16:02
回复 7# ludio333


    数据太多了  要看累死了
作者: sosflyer    时间: 2011-11-09 16:22
回复 8# lybpyn


    $conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'} 这个碰到你那个exists的不就出错了么。
作者: lybpyn    时间: 2011-11-09 16:23
回复 10# sosflyer


    没这个没  但是到下一个就出错了
作者: lybpyn    时间: 2011-11-09 16:26
回复 10# sosflyer


    这个判断if ( exists $conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'})  这样的话返回值是1是正常的
作者: sosflyer    时间: 2011-11-09 16:28
回复 12# lybpyn


    这样当然是正常的,你不是说你用if ( exists $conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->[$m]->{'measResults'})这个来判断的吗?后面多了2级啊。
作者: lybpyn    时间: 2011-11-09 16:36
回复 13# sosflyer


    即使是多一级它也会报错  即使多俩级的话如果不存在函数exists也应该会返回0 啊 但实际上就直接报错了
作者: sosflyer    时间: 2011-11-09 16:48
本帖最后由 sosflyer 于 2011-11-09 16:50 编辑

回复 14# lybpyn


    use strict的话多一级就应该提示了,你那报错的43行是什么啊,是不是赋值了什么的
作者: lybpyn    时间: 2011-11-09 16:51
回复 15# sosflyer


    用了use strici我现在测试多一级一样报错
作者: lybpyn    时间: 2011-11-09 16:52
回复 15# sosflyer


    第43行就是刚才那个判断语句啊
作者: sosflyer    时间: 2011-11-09 16:53
回复 17# lybpyn


    下一行呢
作者: lybpyn    时间: 2011-11-09 16:58
回复 18# sosflyer


    下一行就是判断成功后执行的代码
作者: sosflyer    时间: 2011-11-09 17:00
回复 19# lybpyn


    晕,不多贴点出来,就那一行判断。。如果非看那一行的话,你用use strict就会报错,不用就不提示
作者: lybpyn    时间: 2011-11-09 17:04
回复 20# sosflyer
  1. #!/usr/bin/perl -w
  2. use XML::Simple;
  3. use Data::Dumper;
  4. use strict;

  5. my $xml = new XML::Simple;

  6. my $conf = $xml->XMLin("data.xml");
  7. my $i=0;
  8. my $j=0;
  9. my $m=0;
  10. my $d=0;
  11. my @agr;
  12. my @arr;

  13. my $filename="";
  14. my $filename2="";
  15. my $value=0;
  16. my $value2=0;
  17.          while($conf->{'measData'}->{'measInfo'}->[$i])
  18.        {
  19.                          $filename=$conf->{'measData'}->{'measInfo'}->[$i]->{'measInfoId'};
  20.                          my $tmp=$filename;
  21.                          $filename.="-measTypes.txt";
  22.                          open(fhn,">$filename")|| die $!;
  23.                          
  24.                          my $a=$conf->{'measData'}->{'measInfo'}->[$i]->{'measTypes'};
  25.                          my @arg=split/\s+/,$a;
  26.                          
  27.                          while(@arg)
  28.                    {
  29.                      $value=shift(@arg);
  30.                          $j ++;
  31.              print fhn ("$j\t$value\n");
  32.                    }
  33.            close (fhn);
  34.            
  35.                    $filename2=$tmp."-measResults.txt";
  36.            open(fhn2,">$filename2")|| die $!;
  37.                    #$d=exists $conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->[$m];
  38.                    if ( exists $conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->[$m])
  39.                    {
  40.                    my $c=$conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->[$m];
  41.                    while($conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->[$m]->{'measResults'})
  42.                    {
  43.            my $b=$conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->[$m]->{'measResults'};
  44.                    my @arr=split/\s+/,$b;
  45.                    while(@arr)
  46.                    {
  47.                            $value2=shift(@arr);
  48.                            print fhn2 ("\t$value2\n");
  49.                    }
  50.                    $m ++;
  51.                    }
  52.                    }
  53.                    else
  54.                    {
  55.                            while($conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->{'measResults'})
  56.                    {
  57.            my $b=$conf->{'measData'}->{'measInfo'}->[$i]->{'measValue'}->{'measResults'};
  58.                    my @arr=split/\s+/,$b;
  59.                    while(@arr)
  60.                    {
  61.                            $value2=shift(@arr);
  62.                            print fhn2 ("\t$value2\n");
  63.                    }
  64.                    }
  65.                    }
  66.                   
  67.                    close (fhn2);
  68.                    $i ++;
  69.                    $j =0;
  70.        }

  71.    
复制代码

作者: lybpyn    时间: 2011-11-09 17:07
回复 20# sosflyer


    实际上用或者不用它都会提示报错 没区别
作者: sosflyer    时间: 2011-11-09 17:18
本帖最后由 sosflyer 于 2011-11-09 17:24 编辑

回复 22# lybpyn


    囧,好像你53行这个m++位置有问题
作者: lybpyn    时间: 2011-11-09 17:29
回复 23# sosflyer


    真不是哪的问题!就是因为没有找到所需结构才报错!m++位置没错他是要遍历xml中measValue节点下的所有值
作者: Perlvim    时间: 2011-11-09 20:54
散列的键,不能使用引用。
作者: lybpyn    时间: 2011-11-10 09:00
回复 25# Perlvim


    可以使用啊!怎么会不能用呢
作者: jason680    时间: 2011-11-10 10:11
7楼: 常用Data::Dumper看看吧

看了就知道了....别再浪费时间了....
作者: lybpyn    时间: 2011-11-10 18:32
回复 27# jason680


    我做xml解析需要判断一下 因为有些结构存在有些不存在  直接看结构没啥用
作者: jason680    时间: 2011-11-10 20:40
It's up to you
作者: Perlvim    时间: 2011-11-10 21:44
http://perldoc.perl.org/perlfaq4 ... ce-as-a-hash-key%3F

How can I use a reference as a hash key?

(contributed by brian d foy and Ben Morrow)

Hash keys are strings, so you can't really use a reference as the key. When you try to do that, perl turns the reference into its stringified form (for instance, HASH(0xDEADBEEF) ). From there you can't get back the reference from the stringified form, at least without doing some extra work on your own.

Remember that the entry in the hash will still be there even if the referenced variable goes out of scope, and that it is entirely possible for Perl to subsequently allocate a different variable at the same address. This will mean a new variable might accidentally be associated with the value for an old.

If you have Perl 5.10 or later, and you just want to store a value against the reference for lookup later, you can use the core Hash::Util::Fieldhash module. This will also handle renaming the keys if you use multiple threads (which causes all variables to be reallocated at new addresses, changing their stringification), and garbage-collecting the entries when the referenced variable goes out of scope.

If you actually need to be able to get a real reference back from each hash entry, you can use the Tie::RefHash module, which does the required work for you.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2