【问题标题】:perl hash odd number of elements in hashperl hash 散列中的奇数个元素
【发布时间】:2013-11-16 00:13:59
【问题描述】:

我有这个配置文件

dbUser=customer
dbPass=passwrd
dbSid=customer.shadow
passwdFile=/production/etc-user
tmpUsers=tmpuser
htpasswd=/usr/local/apache2/bin/htpasswd

然后是读取配置文件的脚本:

#!/usr/local/bin/perl
use warnings;
use strict;

readConfig();
# reads in a config file
sub readConfig {
  my $configFile = $ARGV[0];
  my %prefs ="" ;
  open (CONFIG, "< $configFile") or die "Cannot open $configFile for reading: $!\n";
  while (<CONFIG>) {
    chomp;    # kill newlines
    s/#.*//;  # ignore comments
    s/^\s+//; # ignore leading whitespace
    s/\s+$//; # ignore trailing whitespace
    next unless length;
    my($var,$value) = split(/\s*=\s*/, $_, 2);
    $prefs{$var} = $value;
        print "$var : $prefs{$var}\n";
        }
   }

我得到一个奇怪的错误 - 哈希分配中的奇数个元素:

bash-3.00$   /tmp/config_foo  /production/cfg/users.cfg
Odd number of elements in hash assignment at /tmp/config_foo line 10.
dbUser : customer
dbPass : passwd
dbSid : customer.shadow
passwdFile : /production/etc-users1
tmpUsers : tmpuser
htpasswd : /usr/local/apache2/bin/htpasswd
bash-3.00$
bash-3.00$

【问题讨论】:

    标签: perl hash


    【解决方案1】:
    my %prefs = "";
    

    是导致错误的行。散列应该使用具有偶数个元素的列表进行初始化。你可以写

    my %prefs = ();
    

    但没有理由这样做,因为

    my %prefs;
    

    做同样的事情。

    【讨论】:

      【解决方案2】:

      只需使用my %prefs;

      当你说:

      my %prefs ="" ;
      

      您正在使用这种结构创建一个哈希。

      $VAR1 = {
                '' => undef
              };
      

      这是一个使用子程序中的代码的小演示:

      use warnings;                                              
      use strict;        
      
      my %prefs;    
      
      while (<DATA>) {                                                                
          chomp;    # kill newlines                                                   
          s/#.*//;  # ignore comments                                                 
          s/^\s+//; # ignore leading whitespace                                   
          s/\s+$//; # ignore trailing whitespace                                      
          next unless length;                                                         
          my($var,$value) = split(/\s*=\s*/, $_, 2);                                  
          $prefs{$var} = $value;                                                      
          print "$var : $prefs{$var}\n";                                              
      }                                                                               
      
      
      __DATA__                                                                        
      dbUser=customer                                                                 
      dbPass=passwrd                                                                  
      dbSid=customer.shadow                                                           
      passwdFile=/production/etc-user                                                 
      tmpUsers=tmpuser                                                                
      htpasswd=/usr/local/apache2/bin/htpasswd  
      

      然后输出

      dbUser : customer
      dbPass : passwrd
      dbSid : customer.shadow
      passwdFile : /production/etc-user
      tmpUsers : tmpuser
      htpasswd : /usr/local/apache2/bin/htpasswd
      

      【讨论】:

        【解决方案3】:

        分配空哈希时使用()

        所以,只需更改这一行:

        my %prefs ="" ;
        

        到这里:

        my %prefs = ();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-30
          • 2013-11-24
          • 2016-04-15
          • 2013-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-11
          相关资源
          最近更新 更多