Perl中的哈希键和值

时间:2012-10-20 07:15:31

标签: perl

我在Perl中有一个问题:从给定输入中读取一系列姓氏和电话号码。名称和数字应以逗号分隔。然后根据姓氏按字母顺序打印名称和数字。使用哈希。

#!usr/bin/perl
my %series = ('Ashok','4365654435' 'Ramnath','4356456546' 'Aniketh','4565467577');
while (($key, $value) = each(sort %series))
{
 print $key.",".$value."\n";
}

我没有得到输出。我哪里错了?请帮忙。提前致谢

#!usr/bin/perl
my %series = ('Ashok','4365654435' 'Ramnath','4356456546' 'Aniketh','4565467577');
print $_.",".$series{$_}."\n" for sort keys %series;

如果我执行上述2个程序中的任何一个,我会得到相同的输出:

String found where operator expected at line 2, near "'4365654435' 'Ramnath'" (Missing operator before  'Ramnath'?)
String found where operator expected at line 2, near "'4356456546' 'Aniketh'" (Missing operator before  'Aniketh'?)
syntax error at line 2, near "'4365654435' 'Ramnath'"
Execution aborted due to compilation errors

但根据这个问题,我认为我无法将输入存储为my %series = ('Ashok','4365654435','Ramnath','4356456546','Aniketh','4565467577');

3 个答案:

答案 0 :(得分:4)

each仅适用于哈希值。你不能像这样使用sort,它会对列表进行排序而不是哈希。

你的循环可能是:

foreach my $key (sort keys %series) {
  print $key.",".$series{$key}."\n";
}

或者简写:

print $_.",".$series{$_}."\n" for sort keys %series;

答案 1 :(得分:2)

在您的哈希声明中,您有:

my %series = ('Ashok','4365654435' 'Ramnath','4356456546' 'Aniketh','4565467577');

这会产生警告。

哈希只是一个偶数的标量列表。因此,您必须在每对之间加一个逗号:

my %series = ('Ashok','4365654435', 'Ramnath','4356456546', 'Aniketh','4565467577');
             #                    ^---                    ^---

如果要在对之间进行视觉区分,可以使用=>运算符。这与逗号的行为相同。另外,如果左侧是合法的裸字,则将其视为带引号的字符串。因此,我们可以写下任何一个:

# it is just a comma after all, with autoquoting
my %series = (Ashok => 4365654435 => Ramnath => 4356456546 => Aniketh => 4565467577);

# using it as a visual "pair" constructor
my %series = ('Ashok'=>'4365654435', 'Ramnath'=>'4356456546', 'Aniketh'=>'4565467577');

# as above, but using autoquoting. Numbers don't have to be quoted.
my %series = (
   Ashok   => 4365654435,
   Ramnath => 4356456546,
   Aniketh => 4565467577,
);

这最后的解决方案是最好的。最后一个昏迷是可选的,但我认为它很好 - 它可以很容易地添加另一个条目。只要左侧的裸字是合法的变量名称,您就可以使用自动引用。例如。 a_bc => 1有效,但a bc => 1不是(变量名中不允许使用空格),并且不允许+/- => 1(保留字符)。但是,当您的源代码以UTF-8编码并且您的脚本中为Ünıçøðé => 1时,use uft8 允许

答案 2 :(得分:1)

除了amon和Mat所说的,我还想注意你代码中的其他问题:

  • 您的 shebang 错误应该是#!/usr/bin/perl - 请注意第一个/
  • 您的代码中没有use strict;use warnings; - 虽然这不是严格意义上的错误,但我认为这是一个问题。这两个命令将在以后为您节省很多麻烦。

PS:你必须在你的号码和名字之间使用逗号,不仅要在名字和数字之间使用逗号 - 你必须这样做,因为否则会出现编译错误