无法修改列表分配中的键/值哈希片,位于 .\metro.pl 第 31 行,靠近 "$year;"



我是Perl的新手。我不明白为什么我不能在这里为字符串

%currentBook{year}=$year;
完整代码中的哈希字段分配年份。
use warnings;
use strict;
use Scalar::Util qw(looks_like_number);
use Time::localtime; 
my $maxYear = Time::localtime->year+1;
my $year = $maxYear;
my %currentBook = (name=>"firstCurrentBook",
author=>"NO",
place=>"NO",
year=>0);
my %maxBook = %currentBook;
my %minBook = %currentBook;
print "Choose actionn1 - Input bookn2 - Print min max yearn3 = exitn->";
my $cond = <STDIN>;
while ($cond  != 3)
{
if ($cond == 1){
print "nInput book name: ";
$currentBook{name} = <STDIN>;
print "nInput author surname and initials: ";
$currentBook{author} = <STDIN>;
print "nInput place: ";
$currentBook{place} = <STDIN>;    
do{
print "nInput year of book: ";
$year = <STDIN>;
chomp $year;
} while  (!looks_like_number($year) || $year < 0 || $year > Time::localtime->year);
%currentBook{year}=$year;
if (%currentBook{year} > %maxBook{year}){
%maxBook=%currentBook;
}
if (%currentBook{year} < %minBook{year}){
%minBook=%currentBook;
}
}
}

您已经在工具的评论中得到了答案,但我会详细说明为什么会发生这种情况。

my %books = ( year => 2017 );
%books{year} = 2018;

此代码将抛出您看到的错误。

无法在列表分配中修改键/值哈希片/home/simbabque/code/scratch.pl 第 6313 行,靠近"2018;">
由于编译错误,/home/simbabque/code/scratch 的执行.pl中止。

要使程序执行预期操作,需要使用$符号,而不是%符号,因为$books{year}中的值是标量。

但是为什么会出现错误消息?

实际上,%books{year}是一个完全有效的 Perl 表达式。

use Data::Dumper;
my %books = ( year => 2017 );
print Dumper %books{year};

这将打印

$VAR1 = 'year';
$VAR2 = 2017;

构造%book{year}是所谓的哈希切片,它返回键/值对的列表。您还可以输入键列表,并获取键及其值的列表。这对于快速构造子哈希很有用。

my %timestamp = ( year => 2017, month => 12, day => 31, hour => 23, minute => 59 );
my %date = %timestamp{ 'year', 'month', 'day' };
print Dumper %date;

其输出是

$VAR1 = {
'day' => 31,
'month' => 12,
'year' => 2017
};

但是,这种行为不允许您分配给%books{year}。它根本没有意义,因为它返回键/值对的列表。这就是为什么这个结构不是我们在 Perl 中所说的左值,所以它不能在赋的左侧。

最新更新