如何在非类包中重载运算符?

问题描述

在我的情况下,比较字符串相等性时不需要警告Use of uninitialized value in string。因此,我坚决建议改为使用no warnings 'uninitialized'使作用域中的所有此类警告都沉,这样最好使eq-operator自己的子例程重载,例如:

use overload 'eq' => \&undefined_equal;

sub undefined_equal {
  my ( $left,$right ) = @_;
  no warnings 'uninitialized';

  if ( $left eq $right ) {
    return 1;
  }
  return 0;
}

当然,overload不能正常工作,因为根据文档,overload是用于类的,但是我有简单的程序包。

所以我确实尝试重载内置函数,例如:

package REeq;
use strict; use warnings; use 5.014;

BEGIN {
  use Exporter ();
  @REeq::ISA         = qw( Exporter );
  @REeq::EXPORT      = qw( eq );
}

sub eq {
  my ( $left,$right ) = @_;
  no warnings 'uninitialized';

  if ( $left CORE::eq $right ) {
    return 1;
  }
  return 0;
}
1;

我可以给我的eq打电话,但不能将其用作接线员。

我需要它,因为我想要

if ( defined $some_scalar && $some_scalar eq 'literal string' ){
....
}

仅使用

if ( $some_scalar eq 'literal string' ){
....
}

我如何实现我的目标?

解决方法

可以更改 let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] let dbPath = documentsPath+"/mydb.db" do { let text = try String(contentsOfFile: dbPath) //converting dbPath to a pointer to be use in C let cstringForDB = (dbPath as NSString).utf8String let dbFilePathForC = UnsafeMutablePointer<Int8>(mutating: cstringForDB!); } catch { print("error cannot read the db file") } 的行为,但是它需要编写一个XS模块,该模块创建一个操作检查器,以替换eq为范围内的perl操作所执行的代码。例如,eq就是这种方法。

,

似乎可以-我没有尝试过,但是the perl monks have

可以肯定的是,如果您以这种方式看到它……您只需祝福您的变量, 就像处理数字包裹一样。

use overload ...;
my $n = bless {number => 23},"main";
print $n >> 2;

我认为这不是您想要的,只是想表明它是 包名称不是问题,但您必须祝福 对象。


编辑:随身携带zdim ...

use strict;
use warnings;
use overload 'eq' => \&undefined_equal;

sub undefined_equal {
  my ( $left,$right ) = @_;
  no warnings 'uninitialized';

  if ( ${$left} eq $right ) {
    return 1;
  }
  return 0;
}

my $a = "abcde";
my $n = bless \$a,"main";


print "a eq undef -->";
print $a eq undef;

print "<--\nn eq undef -->";
print $n eq undef;
print "<--\n";

给出

$ perl overload.pl
Use of uninitialized value in string eq at overload.pl line 20.
a eq undef --><--
n eq undef -->0<--

请不要忘记子目录中的双$$,否则您将陷入递归。 bless的标量引用似乎只能保佑引用,

它仍然有一个bless,但嘿