我已经意识到(艰难的方法)eq当操作数之一是具有重载字符串化的对象时,运算符会给出致命的运行时错误.
这是一个最小的例子:
my $test = MyTest->new('test');
print 'yes' if $test eq 'test';
package MyTest;
use overload '""' => sub { my $self = shift; return $self->{'str'} };
sub new {
my ( $class, $str ) = @_;
return bless { str => $str }, $class;
}
Run Code Online (Sandbox Code Playgroud)
运行它的结果是:
Operation "eq": no method found,
left argument in overloaded package MyTest,
right argument has no overloaded magic at ./test.pl line 7.
Run Code Online (Sandbox Code Playgroud)
我对阅读perlop的期望是在两个操作数上强制使用字符串上下文,触发字符串化方法$test,然后比较结果字符串.为什么不起作用?什么是实际的hapenning?
我遇到这个问题的上下文是在一个使用autodie和的脚本中Try::Tiny.在 …
是否有一种直接的配置方式,Perl::Tidy以便正确处理使用Devel::Declare?创建的自定义关键字?
具体来说,我正在使用Sub::Curried,它创建一个curry或多或少sub与5.20中的方法签名一样的关键字,但具有currying功能:
curry add ($x, $y) {
return $x + $y;
}
Run Code Online (Sandbox Code Playgroud)
请注意,a ;不是必需的,Perl::Tidy因为它给出了:
curry add( $x, $y ) {
return $x + $y;
}
Run Code Online (Sandbox Code Playgroud)
使用更长的子程序,无论有没有,情况会变得更糟;:
curry add( $x, $y ) {
my $z = $x + $y;
return $z;
};
Run Code Online (Sandbox Code Playgroud)
我想告诉Perl::Tidy要curry完全sub不应该对待.或者,有没有办法让它忽略那些它不理解的部分并且仍然整理文件的其余部分?
我一直在使用XML格式,它混合了不同的现有格式和一些自定义元素和属性,我想我应该为这些自定义位编写一个架构.
我做的一件事是在现有格式的元素上使用自定义属性,如下所示:
<ns1:something attA="b" attB="a" ns2:extraAtt="c"/>
Run Code Online (Sandbox Code Playgroud)
我知道这样做是允许的,但我想不出如何在XML Schema中声明我的"extraAtt",或者更糟糕的是,在DTD中.
我的理解,例如阅读本文,是派生类的构造函数不会调用其虚拟基类的构造函数。
这是我制作的一个简单示例:
class A {
protected:
A(int foo) {}
};
class B: public virtual A {
protected:
B() {}
};
class C: public virtual A {
protected:
C() {}
};
class D: public B, public C {
public:
D(int foo, int bar) :A(foo) {}
};
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,构造函数B::B()和C::C()正在尝试初始化A(在我的理解中,此时应该已经初始化了D):
$ g++ --version
g++ (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see …Run Code Online (Sandbox Code Playgroud) 在尝试分配变量并在Perl中的一个操作中测试它的定义时,就像在if条件中有用一样,我似乎很自然地写:
if ( defined my $thing = $object->get_thing ) {
$thing->do_something;
}
Run Code Online (Sandbox Code Playgroud)
就我的理解而言,右向列表运算符defined的优先级低于赋值的优先级,因此我希望上面的代码等效于:
if ( defined ( my $thing = $object->get_thing ) ) {
$thing->do_something;
}
Run Code Online (Sandbox Code Playgroud)
虽然后者,带括号的代码确实有效,但前者会产生以下致命错误:"无法在标量赋值中修改已定义的运算符".
添加括号并不是什么大不了的事,但我很想理解为什么第一个版本不起作用,例如什么样的"东西" defined是什么,它的优先级是什么?
我刚刚尝试在Python中使用struct.pack,当我混合类型时,我不理解它的行为
当我试图打包一个char而没有别的东西时,它按预期工作,即
struct.pack("b",1)
Run Code Online (Sandbox Code Playgroud)
给'\x01'.但是一旦我尝试混合不同类型的数据,char就被填充为与此类型一样长,例如
struct.pack("bi",1,1)
Run Code Online (Sandbox Code Playgroud)
给'\x01\x00\x00\x00\x01\x00\x00\x00'.
这是标准行为,为什么?有办法解决吗?
编辑
更简单地说:
>>> struct.calcsize("b")
1
>>> struct.calcsize("i")
4
>>> struct.calcsize("bi")
8
Run Code Online (Sandbox Code Playgroud) 使用XML注释文本而不是半结构化数据库语言时,节点顺序非常重要.例如,在此示例中,inode可以是短语和叶子,标记:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<inode>
<leaf id="a"/>
</inode>
<leaf id="b"/>
<inode>
<leaf id="c"/>
</inode>
<leaf id="d"/>
</root>
Run Code Online (Sandbox Code Playgroud)
我习惯了XML::TreePP,但像解析这样的一个例子时,即使使用Tie::IxHash,它会创建两个列表的引用$xml->{'root'}{'inode'}和$xml->{'root'}{'leaf'},这意味着如果我尝试再写一遍,我将获得此:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<inode>
<leaf id="a" />
</inode>
<inode>
<leaf id="c" />
</inode>
<leaf id="b" />
<leaf id="d" />
</root>
Run Code Online (Sandbox Code Playgroud)
是否有人知道Perl模块可以解析表示XML标记的字符串,对其进行一些修改,然后将其作为字符串写回来,同时严格遵守原始的顺序?因为它是纯粹的 - Perl并非绝对必需,尽管它是首选.
我一定perl非常沮丧,因为它给了我一个错误信息,没有记录在perldiag:
PmmREFCNT_dec:对于53a6930,REFCNT递减到0以下!
根据其情绪,有时会出现以下情况:
***glibc检测到***/usr/bin/perl:双重免费或损坏(!prev):0x0000000004e58a60 *
......或更明显地:
分段故障
这显然是致命的,但我也测试过它是可以捕获的.使用时Try::Tiny,我将始终在同一位置捕获错误,但在不使用它时,会在崩溃发生之前执行更多指令.此外,即使我的模块完全是确定性的,并且我非常确定所有依赖关系也是如此,但错误不会一直发生.
不幸的是,给我这个问题的模块是巨大的,有很多依赖,我无法在一个较小的例子上复制问题.因此,我不能请求帮助调试它,但如果熟悉Perl内部的人知道在什么情况下发生此错误,这可能有助于我(或任何其他人将看到此消息)找到问题的根源和/或解决方法.
如果有用,一般的想法是这样的.我有两个班,让我们称他们Thing和SetOfThings.SetOfThings有一个属性是一组Thing实例.这两个类都有一个explode类似这样的方法:
# SetOfThings
sub explode {
my $self = shift;
my $new = dclone $self;
delete $new->{'some_attribute'};
$new->set_of_things( map { $_->explode } $self->constraints );
return $new;
}
# Thing
sub explode {
my $self = shift;
return map { new Thing( do_something_fancy ) } keys %$self;
}
Run Code Online (Sandbox Code Playgroud)
通常在调用SetOfThings::explode或调用SetOfThings::set_of_thingsgetter 时会出现错误. …
Do XML::LibXML::Node::find和相关方法是否保证节点列表总是按照XML文档中的顺序排序?
这对我来说很重要,因为我的文档对应于一个大数组,在这个数组中我希望能够在某些情况下删除一系列项目,并且我必须确保这样的内容一致地工作:
my @nodes = $dom->find('//MyElement[@attr=something]/descendant::Token/@id')
->get_nodelist;
for my $token ( reverse map { $_->value } @nodes ) {
splice @my_big_array, $token, 1;
}
Run Code Online (Sandbox Code Playgroud)
困难在于没有记录XML::LibXML,我不知道这是否取决于libxml2实现,我不了解的文档,或者DOM标准或其他W3C标准,这些标准显然没有被阅读我的凡人.
我需要计算BLEU分数,以确定两个句子是否相似.我读过一些文章,主要是关于测量机器翻译准确度的BLEU分数.但是我需要一个BLEU分数来找出句子之间的相似性.同一种语言[英语].(即)(两个句子都是英文).感谢期待.