问题标签 [tie]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - 我怎样才能挂钩到 Perl 的打印?
这是一个场景。你有大量的遗留脚本,都使用一个公共库。所述脚本使用“打印”语句进行诊断输出。不允许对脚本进行任何更改——它们的范围很广,得到了他们的批准,并且早已离开了富有成效的监督和控制谷。
现在一个新的需求出现了:现在必须将日志记录添加到库中。这必须自动且透明地完成,标准库的用户无需更改他们的脚本。公共库方法可以简单地添加日志调用;这是容易的部分。困难在于这些脚本的诊断输出总是使用“打印”语句显示。必须存储此诊断输出,但同样重要的是,必须对其进行处理。
作为这种处理的一个例子,库应该只记录包含单词“警告”、“错误”、“通知”或“注意”的打印行。下面的非常琐碎和人为的示例代码(tm)将记录一些所说的输出:
(我想避免诸如“实际应该记录什么”、“打印不应该用于诊断”、“perl 很烂”或“这个例子有 xy 和 z 的缺陷”之类的问题......这是为了简洁明了,大大简化了。)
基本问题归结为捕获和处理传递给打印(或任何 perl 内置,沿着这些推理)的数据。是否可以?有什么办法可以干净利落的吗?是否有任何带有钩子的日志记录模块可以让你做到这一点?还是像瘟疫一样应该避免,我应该放弃捕获和处理打印输出?
附加:这必须跨平台运行 - windows 和 *nix 一样。运行脚本的过程必须保持不变,脚本的输出也必须保持不变。
附加附加:在codelogic的回答的评论中提出的一个有趣的建议:
您可以继承http://perldoc.perl.org/IO/Handle.html并创建自己的文件句柄来完成日志记录工作。– 卡米尔·基塞尔
这可能会做到这一点,但有两个警告:
1)我需要一种方法将此功能导出给使用公共库的任何人。它必须自动适用于 STDOUT,也可能适用于 STDERR。
2) IO::Handle文档说你不能子类化它,到目前为止我的尝试都没有结果。使子类化 IO::Handle 工作需要什么特别的东西吗?标准的 'use base 'IO::Handle' 然后覆盖 new/print 方法似乎什么都不做。
最终编辑:看起来 IO::Handle 是一个死胡同,但 Tie::Handle 可能会这样做。感谢所有的建议; 他们都很好。我要试试 Tie::Handle 路线。如果它引起问题,我会回来的!
附录:请注意,在处理了这个之后,我发现 Tie::Handle 可以工作,如果你不做任何棘手的事情。如果您将 IO::Handle 的任何功能与绑定的 STDOUT 或 STDERR 一起使用,那么让它们可靠地工作基本上是一个废话——我找不到让 IO::Handle 的 autoflush 方法在我的绑定上工作的方法处理。如果我在绑定手柄之前启用了自动冲洗,它会起作用。如果这对您有用,则 Tie::Handle 路线可能是可以接受的。
perl - 如何调用绑定变量的方法?
我刚刚开始学习tie。我有一个名为 Link 的类,我想做以下事情:
- 如果获取,则返回链接的地址
- 如果存储,存储新地址
- 能够调用它的方法
到目前为止,我的代码是:
我用来检查功能的代码是:
运行时,脚本将终止并出现以下错误: Can't call method "print_method" without a package or object reference at tietest.pl line 4. .
如果我正确理解它的消息,则解析为调用$var->print_method
该方法的某个字符串。print_method
我怎么能从 tie 中受益,同时也将变量用作对象?
编辑:经过一番试验,我发现如果我在 fetch 上返回 $self ,我可以调用方法,但是 fetch 不会返回地址。
编辑 2:perl 僧侣为我提供了解决方案:并列。绑定将返回对对象 VARIABLE 的引用。
通过结合我的方法,我可以完成我想要的一切。
perl - 延迟 Perl 中范围更改的代码
我经常发现能够安排代码在离开当前范围时执行很有用。在我之前在 TCL 的生活中,一位朋友创建了一个我们称为 defer 的函数。
它启用了如下代码: set fp [open "x"] defer("close $fp");
在当前范围退出时调用它。主要的好处是无论我如何/在哪里离开范围,它总是被调用。
所以我在 Perl 中实现了类似的东西,但似乎有更简单的方法。欢迎评论批评。
我在 Perl 中的做法:
- 创建一个全局绑定变量,其中包含要执行的子数组。
- 每当我想安排在退出时调用 fn 时,我都会使用 local 来更改数组。当我离开当前范围时,Perl 将全局更改为以前的值,因为全局是绑定的,我知道何时发生此值更改并且可以调用列表中的 subs。
实际代码如下。
有一个更好的方法吗?似乎这将是一个普遍需要的能力。
perl - 为什么 Win32::TieRegistry 不能列出子键?
使用 Cygwin Perl v5.8.8 和 Win32::TieRegistry 0.26。
我们可以为 HKEY_CURRENT_USER 获得一个绑定的哈希对象:
这适用于子键:
我们可以打印密钥的信息:
然而文档暗示我们可以简单地通过将其视为哈希来列出子键:
但是数组是空的。是坏了还是我做错了什么?还有另一种列出子键的方法吗?
这也不起作用:
perl - 我可以重载 Perl 的 = 吗?(使用 Tie 时出现问题)
我选择使用 tie 并找到这个:
如果我删除最后一个“$ [0]->{$ [1]}->{'='};”,它将无法正常工作。为什么 ?
我知道需要返回值。但是“$ [0]->{$ [1]};” 也无法正常工作,并且 $ [0]->{$ [1]}->{'='} 不是全部。
旧帖:
我正在用 Perl 编写一个包来解析 INI 文件。只是基于Config::Tiny
.
我想保持部分和键的顺序,所以我使用额外的数组来存储顺序。
但是当我使用“ $Config->{newsection} = { this => 'that' }; # Add a section
”时,我需要重载' =
',以便可以将“newsection”和“this”推入数组。
这是否可以使“ $Config->{newsection} = { this => 'that' };
”工作而不影响其他部分?
部分代码是:
perl - Tie::File 是否延迟加载文件?
我正计划编写一个简单的文本查看器,我希望它能够处理非常大的文件。我正在考虑使用Tie::File
它,并对这些行进行分页。这是懒惰地加载行,还是一次加载所有行?
perl - 如何防止 perl 读取超出访问时缩小的绑定数组的末尾?
有什么方法可以强制 PerlFETCHSIZE
在每次调用之前调用绑定数组FETCH
?我的绑定数组知道它的最大大小,但可能会根据之前FETCH
调用的结果从这个大小缩小。这是一个人为的示例,它将列表过滤为仅具有惰性求值的偶数元素:
为简洁起见,我省略了一堆错误检查代码(例如如何处理从 0 以外的索引开始的访问)
编辑:而不是上面的两个打印语句,如果使用以下两行之一,第一行将正常工作,第二行将引发警告。
更新:
实现可变大小绑定数组的实际模块称为List::Gen,它位于 CPAN 上。该函数的filter
行为类似于grep
,但与List::Gen
的惰性生成器一起使用。有没有人有任何想法可以使实施filter
更好?
(test
功能类似,但undef
在失败的槽中返回,保持数组大小不变,但当然与使用语义不同grep
)
android - 将位图附加到另一个位图上
我有一个班级大楼。它包含一个 _bitmap 对象,引用了一个可绘制对象。我可以在外部视图上绘制它,它的画布调用 myBuilding.getBitmap()。
现在我想在建筑物上绘制一些窗户,但我需要将它们“绑”到建筑物上,以便平移 myBuilding 的 x 和 y,窗户一起移动。
当我调用 myBuilding.getBitmap() 时,有没有办法在主位图(建筑物)上附加位图(窗口)以获得带有窗口的结果建筑物?
谢谢你。
mysql - 更新 MySQL 表中的排名
我有一个表播放器的以下表结构
假设 playerID 和积分具有有效值,我可以根据单个查询中的积分数更新所有玩家的排名吗?如果两个人的分数相同,他们应该并列排名。
更新:
我正在使用建议作为本机查询的查询来使用休眠。Hibernate 不喜欢使用变量,尤其是':'。有谁知道任何解决方法?在这种情况下,通过不使用变量或通过使用 HQL 来解决休眠的限制?
perl - 在 perl 中返回一个延迟计算的标量
我正在尝试通过使用绑定标量向我们的代码库添加一些功能。
我们有一个指定返回标量的函数。我想我可以通过在返回它们之前绑定这些标量来为系统添加一些功能,但看起来 FETCH 方法在返回之前被调用,这导致返回一个未绑定的标量。
有没有办法解决?
如果可能的话,我真的很想保持子例程的接口(返回标量)完好无损。
期望的输出:
我可以通过返回一个引用并在每次访问时取消引用来获得所需的输出,但这会破坏我们已建立的界面,并使我们的用户更加困惑。
——巴克