gpt4 book ai didi

perl - 如何在 Perl 中覆盖诸如 `length` 之类的子例程?

转载 作者:行者123 更新时间:2023-12-05 09:21:44 24 4
gpt4 key购买 nike

我想简单地覆盖 length 子例程以考虑 ANSI 转义序列,所以我这样写:

sub length {
my $str = shift;
if ($cfg{color}) {
return length($str =~ s/\x1B\[\d+[^m]*m//gr);
}
return length($str);
}

不幸的是,Perl 检测到用 CORE::length 替换的模糊调用。

我怎样才能告诉 Perl 使用本地声明呢?

当然,另一种解决方案是将每个对 length 的调用重命名为 ansi_length 并相应地重命名自定义函数。

对于那些想要更多细节的人:

我想覆盖核心模块length的上下文是生成ASCII表的短代码(有点像Text::ASCIITable,但有不同的特性像多列和多行)。我不想编写专用的 Perl 模块,因为我希望我的程序尽可能保持单一,因为使用它的人不熟悉 CPAN 甚至模块安装。

在这段代码中,我需要知道每一行中每一列的宽度,以便正确对齐它们。当单元格包含带有 ANSI 序列(如 ^[[33mgreen^[[0m)的彩色文本时,我需要忽略着色序列。

因为我已经在我的程序中使用了 UTF-8 字符,所以我必须将它添加到我的程序中:

use utf8;
use open ':std', ':encoding(UTF-8)';

我注意到 utf8 模块还重载了核心子例程 length。我意识到这对我来说也是一个很好的解决方案。

最终我认为我为这个问题添加了足够的细节。我很高兴知道为什么我在这个问题上投了反对票。我不认为我可以更清楚地说明这一点。此外,我认为所有这些细节对于理解最初的问题根本没有用......

最佳答案

覆盖核心功能不是一个好主意。如果你使用一个库,它本身使用核心函数,库函数将面临被覆盖的函数并且可能会失败。您可以创建自己的模块/命名空间 ANSI::左右,然后使用 ANSI::length,但我认为最好使用您建议的名称:ansi_length。

如果你还坚持:您可以用

覆盖核心功能
BEGIN {
*CORE::GLOBAL::length = sub ...
}

每当您需要访问 origin CORE 函数时,请使用核心::长度。

这对 Perl 的所有内置函数都有效。

这是一个引用:http://perldoc.perl.org/CORE.html

关于perl - 如何在 Perl 中覆盖诸如 `length` 之类的子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30417028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com