【问题标题】:How to check if LVALUE represents SCALAR如何检查 LVALUE 是否代表 SCALAR
【发布时间】:2023-02-01 17:40:30
【问题描述】:

多年来,我一直在使用包含以下条件的代码

ref \$_[0] eq 'SCALAR'

我一直希望有一个 ARRAYSCALAR,但最近我将 substr() 传递给该参数。意想不到的事情发生了。该条件返回了一个假值。

然后我想通了。 ref 返回了 LVALUE 而不是 SCALAR

由于 LVALUE 是一种奇怪的引用类型,我需要检查它后面是否有标量。

我如何检查这个LVALUE是否代表SCALAR

【问题讨论】:

    标签: perl


    【解决方案1】:

    LVALUE 是一种特殊的神奇值,在分配给它时会发生作用。因此,例如,调用 f($hash{foo}) 不会立即在 %hash 中创建 foo 条目;相反,一个临时的 LVALUE 被创建并作为 $_[0] 传递给 sub。如果 $_[0] 随后被分配给,该值将存储为 $hash{foo}

    LVALUE 是一个标量(即它包含一个值),只是一种奇数类型的标量。

    因此,很可能只需接受 SCALAR 和 LVALUE 作为有效值即可修复代码。但这将取决于进行检查的确切原因。也可能是这样的检查是一个逻辑错误,实际上并不需要,或者是有问题的。例如 ref $_[0] 永远不会返回 ARRAY。

    【讨论】:

    • 啊,你解释得比我好。我认为这确实具有 XY 问题的所有特征。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多