Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何覆盖替换操作?_Perl_Operator Overloading_Overriding - Fatal编程技术网

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

我正在使用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_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";