我是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 action\n1 - Input book\n2 - Print min max year\n3 = exit\n->";
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;
}
}
}
答案 0 :(得分:5)
您已经得到了答案in a comment by toolic,但我会详细说明为什么会这样。
my %books = ( year => 2017 );
%books{year} = 2018;
此代码将引发您看到的错误。
无法在列表赋值中修改键/值哈希切片 /home/simbabque/code/scratch.pl第6313行,靠近&#34; 2018;&#34;
/home/simbabque/code/scratch.pl的执行因编译错误而中止。
要使您的程序按预期执行,您需要使用$
sigil,而不是%
sigil ,因为$books{year}
内的值1}}是一个标量。
但为什么会出现错误信息?
实际上,%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中称为lvalue的原因,因此它不能是on the left hand side of an assignment。