- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想简单地覆盖 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 的所有内置函数都有效。
关于perl - 如何在 Perl 中覆盖诸如 `length` 之类的子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30417028/
我是一名优秀的程序员,十分优秀!