【问题标题】:Can you explain Perl's hash system to a PHP guy?你能向 PHP 人解释一下 Perl 的哈希系统吗?
【发布时间】:2012-01-11 22:55:11
【问题描述】:

Perl 哈希是如何工作的? 它们是像 PHP 中的数组还是一些完全不同的野兽?

据我了解,它只是一个关联数组,对吗?这是我开始之前的想法 与一个 Perl 程序员交谈,他告诉我我完全错了,但无法以某种方式解释它 这并没有让我的眼睛交叉。

不管怎样,我认为它的工作方式是这样的

PHP 的:

$argv['dog_name'] = 'missy';
$argv[0] = 'tree';

和 Perl 的一样:

my %argv{'dog_name'} = 'missy';
my $argv[0] = 'tree';

对吗?但是你不能print(%argv{'dog_name'}),你必须(恢复?)到print($argv{'dog_name'}),这很混乱?

它现在是否尝试像在 PHP 中那样打印为变量,echo $argv['dog_name']; ?这是否意味着(再次)哈希是 只是一个 PHP 关联数组,其中要声明一个 % 但要访问一个 $?

我不知道,我希望一些 PHP/Perl 大师能解释一下哈希是如何工作的,以及它们有多相似 到 PHP 的数组。

【问题讨论】:

  • 我删除了抱怨和侮辱并改进了语法。此外,您所要求的内容非常基本 - 不确定您在哪里找到了一个不知道这是如何工作的 Perl 程序员 - 不过,老实说,我不希望随机的初级 Perl 程序员知道什么是“关联数组” "的意思是不用谷歌搜索。或者是 Java 程序员,就此而言
  • 感谢您编辑垃圾,我是一名高级 PHP 程序员,接手了一个 PERL 项目,但并不真正了解 PERL。这就是为什么这个愚蠢的问题,我只是想了解一下我猜的 PERL 术语以及它的真正含义。

标签: php perl hash hashmap associative-array


【解决方案1】:

写作

$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 手册页上找到更多详细信息。

简而言之,符号从%变为$的原因是%hash指的是复数哈希(键值对的列表),而$hash{foo}指的是a的单个元素哈希。这与数组相同,其中@ 指的是整个数组,$ 指的是单个元素。 (对于数组和散列,带有下标的前导@ sigil 表示数据切片,其中传递了多个键并返回值列表)

【讨论】:

  • 谢谢,你描述的方式更有意义。
【解决方案2】:

为了稍微详细说明 Ambrose 的回答,您感到困惑的原因是在 Perl 和 PHP 中使用 sigils 的理念不同。

在 PHP 中,印记附在标识符上。例如。哈希标识器周围总是有一个哈希标记。

在 Perl 中,您访问数据结构的方式(您访问的是 1 个值、值列表还是值的整个散列)附加了一个标记 - 详情请参阅其他出色的答案,例如 Eric 的。

【讨论】:

  • 这是否意味着如果我试图访问单个变量我会使用现金,但如果我试图引用整个(数组?)哈希我会使用百分位数?
  • @ehime - 正确。当将哈希作为数据结构寻址时,它是“%hash”;当寻址散列的单个元素时,它是“$hash{$key}”:my %hash = ( 1 => 2 ); my $value = $hash{1}; my %hash_copy = %hash;。但是请注意,引用是单个元素,例如对哈希的引用总是用$ 标记(例如my $hashRef = { 1 => 2}; my $value = $hashRef->{1}; my $copy_of_hash_ref = $hashRef;
【解决方案3】:

%argv{'dog_name'} 是语法错误。你需要$argv{'dog_name'}

但是你是正确的,perl 哈希 只是一个关联数组(为什么 perl 选择使用不同的术语,我不知道)。

为了全面了解散列,我建议阅读任何涵盖该主题的大量 perl 教程或书籍。 Programming Perl 是一个很好的选择,或者我也找到了一个随机的online tutorial

【讨论】:

  • A hash table 是 Perl 使用的 associative array 的具体类型,“hash”比“associative array”更容易说。我不知道PHP是否使用哈希表。
  • @ikegami 这就是为什么我更喜欢术语“映射”而不是“关联数组”来谈论 ADT:不幸的是,后者虽然名称似乎暗示了某种“类数组” " 不一定正确的语义(例如在关联列表中看到的那些);-)
【解决方案4】:

作为 Flimzy,我也推荐 Programming Perl。作为我最近从 PHP 到 Perl 的转换,它教会了我很多关于该语言的知识。

% 符号用于创建一个完整的“关联数组”,正如我们所想的那样。例如,我可以通过执行以下操作来创建关联数组:

%hash = ('key1' => 'value1', 'key2' => 'value2');

然后我可以像这样打印出来:

print %hash;

输出会是这样的:

'key2value2key1value1'

我相信这就是所谓的“列表上下文”,因为% 表明我们正在讨论一系列值。

另一方面,如果我想访问单个值,我们将不得不使用$ sigil。正如“Programming Perl”告诉我们的那样,这可以被认为是“Scalar”的“S”。每当我们谈论奇异值时,我们都必须使用$ 符号。

因此,要访问数组中的单个项目,我必须使用以下语法:

print $hash{'key1'}; 

数组也是如此。可以像这样创建一个完整的数组:

@array = ('abc', '123');

然后像这样打印:

print @array;

但是,要访问数组的单个元素,我会键入:

print $array[0];

这里有很多基本原则。您应该详细阅读“列表上下文”和“标量上下文”。不久之后,您还会想查看引用,这是您在 Perl 中用于创建多维结构的东西。我真的会推荐'Programming Perl'!在章节中阅读起来很困难,但它确实涵盖了您需要了解的所有内容(以及更多内容)。

【讨论】:

    【解决方案5】:

    印记的改变并没有你说的那么复杂。你已经在不假思索地用英语做到了。

    如果您有一组汽车,那么您会谈论“这些汽车”(或“那些汽车”)。这就像一个数组。

    my @cars = ('Vauxhall', 'Ford', 'Rolls Royce');
    

    如果您只谈论该系列中的一辆车,您可以改用“这辆车”。这就像数组中的单个元素。

    say $car[1]; # prints 'Ford';
    

    类似的规则也适用于哈希。

    【讨论】:

      【解决方案6】:

      我会说你的困惑部分是由一个简单的事实造成的。 Perl 对不同的事物有不同的符号。 PHP 对所有事物都有一个印记。

      因此,无论您是将某些内容放入数组/散列中,还是取出某些内容,或声明一个简单的标量变量,在 PHP 中您总是使用美元符号。

      对于 perl,您需要更具体,仅此而已。

      【讨论】:

      • 感谢您指出这一点,这确实是我不知道的事情。
      【解决方案7】:

      “sigil”,即变量名前的字符,表示正在访问的数据量,如下:

      • 如果您说$hash{key},您使用的是标量上下文,即一个值。

      • 对于复数或列表上下文,符号更改为 @,因此 @hash{('key1', 'key2')} 返回与两个键相关联的两个值的列表(也可以写为 @hash{qw(key1 key2)})。 p>

      • %hash 用于访问整个哈希。

      这同样适用于数组:$arr[0] = 1,但@arr[1 .. 10] = (10) x 10

      【讨论】:

      • “context”这个词在 Perl 中已经有某种含义了,它并不是你上面描述的意思!变量不决定上下文,运算符/函数决定列表或标量上下文。符号确定“您正在访问的内容”,而不是标量/列表上下文。 "print $hash{key}" 将 LIST 上下文强加在 $hash{key} 上。 $hash{key} 上的“$”表示您正在访问哈希中的单个值。
      【解决方案8】:

      我希望您不要期望在这里获得有关 perl 哈希的完整教程。你不需要 Perl 大师来解释你的哈希,只需一个简单的谷歌搜索。

      http://www.perl.com/pub/2006/11/02/all-about-hashes.html

      PS:请提高你的接受率 - 62% 相当低

      【讨论】:

      • 解决了这个问题,抱歉,我问的很多问题都是我自己回答的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多