问题描述
在我的情况下,比较字符串相等性时不需要警告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
,但嘿