你能解释一下Perl';s的哈希系统


Can you explain Perl's hash system to a PHP guy?

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%是相当低的