perl hash hash中的奇数个元素

时间:2013-11-16 00:13:59

标签: perl hash

我有这个配置文件

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$

3 个答案:

答案 0 :(得分:7)

my %prefs = "";

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

my %prefs = ();

但是没有理由,因为

my %prefs;

做同样的事情。

答案 1 :(得分:6)

只需使用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

答案 2 :(得分:3)

在分配空哈希时使用()

所以,只需改变这一行:

my %prefs ="" ;

对此:

my %prefs = ();