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

Dmy*_*nko 3 perl hash

我正在尝试将哈希中的键名设置为字符串containsig"/"符号

$myshash{"/dev/shm"} = "shared memory";
Run Code Online (Sandbox Code Playgroud)

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

Jed*_*ith 27

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

这对我来说很好:

use Data::Dumper;

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

print Dumper(\%hash);
Run Code Online (Sandbox Code Playgroud)

和输出:

$VAR1 = {
          '/dev/shm' => 'shared memory'
        };
Run Code Online (Sandbox Code Playgroud)

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


Sin*_*nür 17

记得给Data :: Dumper引用你要转储的内容:

use Data::Dumper;
my %myshash;
$myshash{"/dev/shm"} = "shared memory";
print Dumper \%myshash;
Run Code Online (Sandbox Code Playgroud)

输出:

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

另见perldoc perldata:

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