Perl散列是如何工作的?它们是像PHP中的数组,还是完全不同的野兽?
据我所知,它只是一个关联数组,对吧?这就是我开始之前的想法与一位Perl程序员交谈,他告诉我我完全错了,但无法以某种方式解释这并没有让我的眼睛交叉。
不管怎样,我认为它的工作方式就像这个
PHP:
$argv['dog_name'] = 'missy';
$argv[0] = 'tree';
与Perl的相同:
my %argv{'dog_name'} = 'missy';
my $argv[0] = 'tree';
对吧?但是您不能打印(%argv{'dog_name'}(,您必须(恢复?(到打印机($argv{''dog_name'}( 它现在是否像在PHP中那样尝试作为变量打印,echo$argv['dog_name']?这(再次(意味着散列是只是一个PHP关联数组,其中有一个%要声明,但有一个$要访问? 我不知道,我希望一些PHP/Perl专家能解释散列是如何工作的,以及它们有多相似到PHP的数组。
写入
$argv['dog_name'] = 'missy';
$argv[0] = 'tree';
在Perl中,您可以按如下方式编写:
$argv{dog_name} = 'missy';
$argv{0} = 'tree';
如果你有严格的,你应该这样做,那么你需要预先声明变量:
my %argv;
$argv{dog_name} = 'missy';
$argv{0} = 'tree';
如果上面的内容对你来说有点重复,你可以写出来:
my %argv = (
dog_name => 'missy',
0 => 'tree',
);
您可以在perldata手册页上找到更多详细信息。
简而言之,sigils从%
变为$
的原因是%hash
指多个散列(键值对的列表(,而$hash{foo}
指散列的单个元素。这与数组相同,其中@
表示完整的数组,$
表示单个元素。(对于数组和散列,带下标的前导@
sigil表示数据的一部分,其中传递多个键并返回一系列值(
要稍微详细说明Ambrose的答案,您感到困惑的原因是在Perl和PHP中使用sigil的原理之间的差异。
在PHP中,sigil附加在标识符上。例如,散列标识符总是有一个散列标志。
在Perl中,一个sigil附加在访问数据结构的方式上(您访问的是1个值、一个值列表还是一个完整的值哈希(-有关详细信息,请参阅其他优秀的答案,如Eric的。
%argv{'dog_name'}
是一个语法错误。您需要$argv{'dog_name'}
。
但您是正确的,perl散列只是一个关联数组(我不知道为什么perl选择使用不同的术语(。
为了完全理解hashes,我建议阅读大量涉及该主题的perl教程或书籍中的任何一本。编程Perl是一个很好的选择,或者这里是我发现的一个随机的在线教程。
作为Flimzy,我也建议使用Perl编程。作为一名最近从PHP到Perl的转换者,它教会了我很多关于该语言的知识。
%
符号用于创建一个完整的"关联数组",正如我们所想的那样。例如,我可以通过以下操作创建一个关联数组:
%hash = ('key1' => 'value1', 'key2' => 'value2');
然后我可以这样打印出来:
print %hash;
输出将类似于:
'key2value2key1value1'
我相信,这被称为"列表上下文",因为%
表示我们谈论的是一系列值。
另一方面,如果我想访问单个值,我们必须使用$
sigil。正如"编程Perl"告诉的那样,这可以被认为是"Scalar"的"S"。每当我们谈论奇异值时,我们都必须使用$
符号。
因此,要访问数组中的单个项,我必须使用以下语法:
print $hash{'key1'};
数组也是如此。一个完整的数组可以这样创建:
@array = ('abc', '123');
然后像这样打印:
print @array;
但是,要访问数组的单个元素,我会键入:
print $array[0];
这里有很多基本原则。您应该详细阅读"列表上下文"answers"标量上下文"。不久之后,您还会想要查看引用,这些引用是您用来在Perl中创建多维度结构的东西。我真的推荐"编程Perl"!这是一本很难阅读的书,但它确实涵盖了你需要知道的一切(以及更多(。
信号的变化并不像听起来那么复杂。你已经不用想就用英语做了。
如果你有一套车,那么你会谈论"这些车"(或"那些车"(。这就像一个数组。
my @cars = ('Vauxhall', 'Ford', 'Rolls Royce');
如果你只谈论那一组中的一辆车,你可以改用"这辆车"。这就像一个数组中的单个元素。
say $car[1]; # prints 'Ford';
类似的规则也适用于哈希。
我想说,您的困惑部分是由一个简单的事实引起的。Perl对于不同的事物有不同的符号。PHP对所有内容都有一个sigil。
因此,无论你是把一些东西放入数组/散列,还是从中取出一些东西,或者声明一个简单的标量变量,在PHP中,你总是使用美元符号
使用perl,您需要更加具体,仅此而已。
"sigil",即变量名之前的字符,表示访问的数据量,如下所示:
-
如果说
$hash{key}
,则使用标量上下文,即一个值。 -
对于复数或列表上下文,sigil变为
@
,因此@hash{('key1', 'key2')}
返回分别与两个键相关联的两个值的列表(也可以写成@hash{qw(key1 key2)}
(。 -
CCD_ 18用于作为一个整体来访问散列。
这同样适用于数组:$arr[0] = 1
,但@arr[1 .. 10] = (10) x 10
。
我希望您不会期望在这里获得关于perl哈希的完整教程。你不需要Perl大师来解释你的散列,只需要一个简单的谷歌搜索。
http://www.perl.com/pub/2006/11/02/all-about-hashes.html
PS:请提高您的接受率-62%是相当低的