为什么我将Perl哈希视为一个分数,如'28 / 64'?

时间:2009-11-03 20:20:57

标签: perl hash

我正在尝试将哈希中的键名设置为字符串containsig“/”符号,例如

$myshash{"/dev/shm"} = "shared memory";

但是当我使用Data :: Dumper查看时,我得到的是类似'28 / 64'等等。 如何在哈希键名称中使用这些特殊字符?

4 个答案:

答案 0 :(得分:27)

28/64来自将哈希视为标量,并且表示使用了多少桶(以及桶的总数)。将其转储为哈希而不是标量,您应该看到正确的数据 - 您所做的事情没有任何问题。

这对我来说很好用:

use Data::Dumper;

my %hash;
$hash{"/dev/shm"} = "shared memory";

print Dumper(\%hash);

和输出:

$VAR1 = {
          '/dev/shm' => 'shared memory'
        };

要澄清并回答您的根问题,您不会在哈希中使用特殊字符。由于大多数语言在内部将字符串散列为一个整数(仍在学习Perl,但这就是Python的工作方式),如果你愿意,你可以在那里放置高等精灵的着作中的符文字形,并且键创作会很好。哈希函数无关紧要。

答案 1 :(得分:17)

请记住为您要转储的内容提供Data :: Dumper引用:

use Data::Dumper;
my %myshash;
$myshash{"/dev/shm"} = "shared memory";
print Dumper \%myshash;

输出:

C:\Temp> t.pl
$VAR1 = {
          '/dev/shm' => 'shared memory'
        };

另见perldoc perldata

  

如果在标量上下文中评估散列,则在散列为空时返回false。如果有任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的桶数和分配的桶数组成,用斜杠分隔。这非常有用,只是为了找出Perl的内部哈希算法是否在您的数据集上表现不佳。

答案 2 :(得分:3)

你的哈希工作得很好......只是你错误地使用了Data :: Dumper。

如果你这样做:

print $myshash{"/dev/shm"};

你会发现它正在发挥作用。

答案 3 :(得分:3)

看起来它对我有用:

$ perl -de0

Loading DB routines from perl5db.pl version 1.3
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1):   0
  DB<1> $myshash{"/dev/shm"} = "shared memory";

  DB<3> x %myshash
0  '/dev/shm'
1  'shared memory'
  DB<4>