在 perl 中使用键值中的空格进行哈希处理



我们可以安全地使用键值在两者之间包含空格的哈希表吗?例如:

my $key1="Dave 2314";
my $key2="John 3212";
$newhash{$key1}= 35;
$newhash{$key2}= 46;

我在我的一个程序中使用了类似的代码段。我觉得哈希确实有效,但存在函数不顺利=>

print "Foundn" if (exists $newhash{$searchKey}) 

这给出了荒谬的结果。有时它运行良好,如果键存在,则返回正确的响应,有时它不适用于相同的输入。按键中有空格是造成这种荒谬功能的原因吗?

你得到什么荒谬的结果?哈希不关心密钥中的内容。你确定你$searchKey有正确的东西吗?如果您从用户输入中获取它,末尾是否有额外的换行符?

这应该工作:

my %newhash;
my $key1="Dave 2314";
my $key2="John 3212";
$newhash{$key1} = 35;
$newhash{$key2} = 46;
print "Foundn" if exists $newhash{$key1};

但是,还有另一个问题。可以在大括号中包含用于哈希元素单一访问的代码。当你只有一个标量变量时,它可以工作。这是一个语法错误,因为有一个裸词Dave、一个空格和一个文字数字1234

print "Foundn" if exists $newhash{Dave 2314};

不过,这不是语法错误,因为有一个名为Dave的函数(恰好返回一个存在的键(。我相信这不是你的问题:

sub Dave { 'John 3212' }
print "Foundn" if exists $newhash{Dave 2314};

换一种写法:

sub Dave { 'John 3212' }
print "Foundn" if exists $newhash{ Dave(2314) };

还有另一种方式:

print "Foundn" if exists $newhash{ join ' ', qw(John 3212 ) };

如果它是文字,您应该引用该键:

print "Foundn" if exists $newhash{'Dave 2314'};

如果字符串看起来不像代码,则可以使用不带引号的字符串。这看起来像'Dave'

print "Foundn" if exists $newhash{Dave};

但是这个呢?该点实际上是字符串连接运算符,它认为Dave是一个裸词。如果您尚未定义子例程,这是一个语法错误:

print "Foundn" if exists $newhash{Dave.John};

不过这行得通。点前面的东西是子例程调用,但后面的东西是字符串:

sub Dave { 'John 3212' }
print "Foundn" if exists $newhash{Dave.John};

所以有一些奇怪的边缘情况。但我通常没有这个问题,因为我总是引用文字键。

感谢大家投入时间。 问题出在我的代码本身。整个逻辑基于一个标志变量,我没有在需要时正确重置。 所以要回答我自己的问题,键字符串之间的空格应该不是问题。

最新更新