我们可以安全地使用键值在两者之间包含空格的哈希表吗?例如:
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};
所以有一些奇怪的边缘情况。但我通常没有这个问题,因为我总是引用文字键。
感谢大家投入时间。 问题出在我的代码本身。整个逻辑基于一个标志变量,我没有在需要时正确重置。 所以要回答我自己的问题,键字符串之间的空格应该不是问题。