【问题标题】:What's the difference between these two definitions?这两个定义有什么区别?
【发布时间】:2012-06-14 14:09:28
【问题描述】:

为什么是语法错误:

my @hash{1..4}=(1..4);

但不是这个:

my %hash;
@hash{1..4}=(1..4);

【问题讨论】:

    标签: perl perl-hash


    【解决方案1】:

    第一个例子是一个词法范围的'my' +一个hash slice,它预先假设可以以无效语法的切片方式声明哈希。你的第二个例子是合适的,首先声明哈希,假设你正在使用严格 + 警告;

    【讨论】:

    • 这是一个语法错误问题,而不是“必须声明(必须存在)才能使用的变量”问题。您可以对以前不存在的哈希进行切片分配:perl -E '%h{1..4}=(); say for keys %h;'。 OP 的问题是您不能 my 在同一语句中声明 访问元素。
    • 正确,我认为这在我所说的内容中是隐含的。也许不是,因此我链接到 perldata 切片页面。
    • 您对答案的表述方式使(在我看来)您将%hash 的不存在确定为问题,而不是语法上拙劣的声明作为问题。
    • :耸耸肩:其他人似乎已经理解并且我的回答被接受了,所以看来我所说的对于 OP 来说已经足够了。但我可以看到我的快速解释没有完全阐明语法、数据结构和切片之间的语义差异。
    • @ikegami 我已经重做了我的帖子。我期待您在未来有更多礼貌、友好和建设性的 cmets。
    【解决方案2】:

    my 需要一个变量或括号中的变量列表作为参数。

    @hash{1..4}
    

    两者都不是,所以

    my @hash{1..4}
    

    是语法错误。

    【讨论】:

      【解决方案3】:

      第一个例子失败了,因为哈希切片是一个返回一些结果的操作。显然,用my 声明附加它是没有意义的,就像写my 2+2 这样的东西不会。 my must be followed by list of variables to declare.

      第二个例子就是这样做的——在当前范围内声明一个哈希,然后访问它的一部分。

      【讨论】:

      • $a 也是一个返回一些结果的操作,但是你可以在它前面放置一个my。这不是一个正确的答案,虽然很接近。
      • “my 后面必须跟要声明的变量列表”应该涵盖 my 的确切有效范围。
      • 这是我评论的第一句话。 (虽然那个也不完全正确:my $x, $y 没有按照你说的那样做。)
      • 好吧,我只是添加一个指向my的链接,所以我不必完全引用它。
      猜你喜欢
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      相关资源
      最近更新 更多