1

我在 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');

4

3 回答 3

4

each仅对哈希进行操作。你不能这样使用sort,它对列表进行排序而不是哈希。

您的循环可能是:

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

或简写:

print $_.",".$series{$_}."\n" for sort keys %series;
于 2012-10-20T07:26:29.517 回答
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

于 2012-10-20T10:16:37.557 回答
1

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

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

PS:你必须在你的数字和名字之间使用逗号,不仅在名字和数字之间 - 你必须这样做,否则你会得到一个编译错误

于 2012-10-20T16:29:53.350 回答