perl中的bless和tie有什么区别?

What is difference between bless and tie in perl?

我在练习一些面试题时发现了这个。我查看了 perldoc -f tie,但没找到。我知道 bless 并在我的程序中使用。

谁能告诉我什么是 tie 以及它与 bless 的相关和不同之处,及其用法?我会很感激任何简单的例子。

PS:我是一名 perl 开发人员并在日常生活中使用它。我关心的不是面试,而是了解

我可能会这样回答你的面试问题:

Tie 和 bless 具有相似的功能,因为它们将自定义行为与变量相关联。不同之处在于关注点 - tie 是关于向 'standard' 数据结构添加新行为,而 bless 是关于完全创建 'new' 数据结构。

因此,使用 tie 时,您更受限于所使用数据类型的基本操作,其中 blessed 数据结构具有几乎无限的可能性范围。但权衡是 tieed 变量可以作为替换的替代品 - 如果你通过 tieing 将它扩展到文件或数据库,它仍然可以在相同的地方运行 'hash'无需任何类型的代码修改的方式。

这种优势在很多方面也是弱点 - 未来的程序员在面对对象和某些代码中的方法调用时,会知道他们需要查看 class 以了解发生了什么on - 他们可能没有意识到绑定的哈希(或标量)正在做 'something special'。

因此我建议,作为一种风格,tie 应该保留用于诊断和测试角色 - 当哈希中的值发生变化时记录日志可能很方便,但不应该使用使事情以意想不到的方式运行。

bless用于构造对象

tie 允许代码为接口提供变量。例如看起来您正在分配给一个变量,但您实际上是在调用一个子变量。 tie 和其他形式的魔术主要用于提供 "clever" 接口(例如,改变 %ENV 改变环境,改变 %SIG 设置信号处理程序,$! 镜像两者errnoperror,等等)。它还可以用于扩展现有代码的实用性(例如,创建看起来像文件句柄的东西允许人们重用期望从文件句柄获取输入的代码)。