Perl 如何覆盖替换操作?
我正在使用Perl并创建一个string对象。我知道在现实世界中这样做是一个非常糟糕的主意。我这样做纯粹是为了好玩 我使用在大多数其他语言中可以找到的标准运算符重载标准Perl字符串运算符Perl 如何覆盖替换操作?,perl,operator-overloading,overriding,Perl,Operator Overloading,Overriding,我正在使用Perl并创建一个string对象。我知道在现实世界中这样做是一个非常糟糕的主意。我这样做纯粹是为了好玩 我使用在大多数其他语言中可以找到的标准运算符重载标准Perl字符串运算符 use strict; use warnings; use feature qw(say); my $obj_string1 = Object::String->new("foo"); my $obj_string2 = Object::String->new("bar"); my $reg_s
use strict;
use warnings;
use feature qw(say);
my $obj_string1 = Object::String->new("foo");
my $obj_string2 = Object::String->new("bar");
my $reg_string1 = "foobar";
my $reg_string2 = "barfu";
# Object::String "stringifies" correctly inside quotes
say "$obj_string1 $obj_string2";
# Use "+" for concatenations
say $obj_string1 + $obj_string2; # Works
say $obj_string1 + $reg_string1 + $reg_string2 # Works
say $reg_string1 + $obj_string1 # Still works!
say $reg_string1 + $obj_string1 + $reg_string2; # Still works!
say $reg_string1 + $reg_string2 + $obj_string1; # Does't work, of course.
# Overload math booleans with their string boolean equivalents
my $forty = Object::String(40);
my $one_hundred = "100";
if ( $forty > $one_hundred ) { # Valid
say "$forty is bigger than $one_hundred (in strings!)";
}
if ( $one_hundred < $forty ) { # Also Valid
say "$one_hundred is less than $forty (In strings!)";
}
# Some standard "string" methods
say $forty->length # Prints 5
say $forty->reverse; # Prints "ytrof"
say $forty; # Prints "ytrof"
如您所见,当我进行替换时,它工作正常,但返回一个常规标量字符串,而不是Object::string
我正在试图找出如何覆盖替换操作。我查阅了Perldoc,阅读了各种Perl书籍(高级Perl编程、中级Perl编程、Perl烹饪书等),但没有找到覆盖替换操作的方法,因此它返回一个对象::字符串
如何重写替换操作?不幸的是,Perl的重载支持在字符串领域不是很普遍。有许多操作不是重载的一方;而
s//
就是其中之一
我已经启动了一个模块来解决这个问题;但到目前为止还不完整。它允许您为对象重载substr()
函数,但到目前为止,它还没有能力应用于m/
或s///
但是,您可能能够在对象上使用左值(或4参数)substr()
,以此来欺骗对象;如果对象至少字符串化为可以匹配的常规字符串,则可以使用substr()
-rewrite技巧进行替换
转向
进入
然后,如果您使用上面的模块,您将得到一些代码,这些代码将尊重$string
对象上的substr()
重载
当然,在某种程度上,如果
重载::substr
能够自己执行,那就太好了;我只是还没来得及写它。会substr($string,0)=~s/pattern/replacement/代码>做这个把戏吗?哦,我可以做大多数语言都做的事情,我可以使用$string\u obj->sub($regex,$repl,$flags)
方法来实现类似$string=~s/$regex/$repl/$flags
。我的计划是创建对象::字符串
,对象::数字
,对象::整数
,对象::数组
,并包括复制基本Perl命令的方法。你把用对象化在程序中编写>并用Perl以(某种)完全面向对象的风格编写。所有类都使用croak
,因此Perl也变得基于异常。弹出一个没有成员的列表或数组,程序就会崩溃。当然,学习Python会更容易,但我不想让Guido van Rossum感到满意。@DavidW。现在你基本上是在重新创建autobox
。@LeoNerd-谢谢,我以前从未听说过autobox。我看到autobox::Core
在某些命令中使用croak
,而不是返回unde
,因此它也是基于异常的。它没有使用超负荷,这很奇怪。我希望能够使用普通布尔运算符。将其与IO::File
结合使用,以进行print
,而不是使用内置的autobox方法。
my $string = Object::String("I am the best programmer around!");
say $string; # Prints "I am the best programmer around"
say $string->get_value; # Prints "I am the best programmer around" with get_value Method
# But, it's time to speak the truth...
$string =~ s/best programer/biggest liar/;
say $string; # Prints "I am the biggest liar around"
say $string->get_value; # Whoops, no get_value method on scalar strings
$string =~ s/pattern/replacement/;
$string =~ m/pattern/ and substr($string, $-[0], $+[0]-$-[0]) = "replacement";