我查了几个处理这个警告的答案,但他们也没有帮助我,也没有真正理解Perl在这里做的事情.这就是我想要做的事情:
sub outerSub {
my $dom = someBigDOM;
...
my $otherVar = innerSub();
return $otherVar;
sub innerSub {
my $resultVar = doStuffWith($dom);
return $resultVar;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我有一个存储在$ dom中的大DOM对象,如果可能的话我不想在堆栈中传递.在outerSub中,正在发生需要来自innerSub的结果的东西.innerSub需要访问$ dom.当我这样做时,我收到这个警告"变量$ dom将不会保持共享".
我不明白的是:
这个警告对我有疑虑吗?我的逻辑会在这里运作还是会发生奇怪的事情?
如果它不能按预期工作:是否可以这样做?使局部变量对嵌套子变得可见?或者将它作为参数传递更好?或者声明一个"我们的"变量是否更好?
如果我将它作为参数推送,整个对象及其所有数据(可能有几个MB)是否会被推入堆栈?或者我可以传递类似参考的东西?或者Perl是否将该参数作为参考单独处理?
在"变量$ foo将不会保持共享"Perl中的警告/错误在调用子例程时,有人会谈论一个匿名子,这将使这成为可能.我不明白它是如何工作的,从来没有使用过这样的东西.
我根本不理解这个解释(可能导致英语不是我的第一语言):"当调用内部子程序时,它将看到外部子程序变量的值,就像它在第一次调用外部子程序之前和期间一样. ;在这种情况下,在第一次调用外部子程序完成后,内部子程序和外部子程序将不再共享变量的公共值.":
"对外部子程序的第一次调用是完整的是什么意思?"
我的意思是:首先我称之为外部子程序.外部子调用内部子.外子当然还在运行.一旦外部子完成,内部子也将完成.那么当内部子已经完成时,这仍然适用于什么呢?那么"第一次"召唤呢?什么时候发生"第二次"通话......对不起,这个解释让我感到困惑.
对不起,有很多问题.也许有人至少可以回答其中一些问题.
我在 Java Maven 项目中收到此错误。奇怪的是,它并没有出现在每台机器上,所以我认为它与配置问题有关。
RoleKeyCacheImpl 类是一个 @Startup @Singleton:
@Startup
@Singleton
public class RoleKeyCacheImpl implements RoleKeyCache { ... }
Run Code Online (Sandbox Code Playgroud)
这是 Wildfly 在部署服务时触发的错误。
引起原因:java.lang.IllegalArgumentException:WFLYEE0040:名为“RoleKeyCacheImpl”的组件已在此模块中定义,位于 org.jboss.as.ee.component.EEModuleDescription.addComponent(EEModuleDescription.java:167) 处 org.jboss.as .ejb3.deployment.processors.EJBComponentDescriptionFactory.addComponent(EJBComponentDescriptionFactory.java:58)
我试过了:
删除并重建本地 Maven 代表(“.m2”)-> 无效
在另一台计算机上检查相同的源 -> 在一台计算机上确实有效,在另一台计算机上却给出了相同的错误
我完全不知道问题是什么,甚至可能是什么。在一台机器上,我们检查它,它运行没有错误。在其他情况下,也会发生完全相同的错误。
有人有想法吗?
这两种方法有区别吗?
public String toString() {
return this.from.toString() + this.to.toString();
}
public String toString() {
return new String(this.from.toString() + this.to.toString());
}
Run Code Online (Sandbox Code Playgroud)
(当然,假设from.toString()和to.toString()方法正在返回字符串).
基本上我对Java中的字符串处理感到困惑,因为有时字符串被视为基本类型,即使它们是类实例.
我有一个跟进问题,我的早期帖子按数值排序文件名.
解决方案是这段代码:
opendir(XMLDIR,$xmldirname);
my @files = sort {substr($a, 0, index($a, '.')) <=> substr($b, 0, index($b, '.'))} readdir(XMLDIR);
Run Code Online (Sandbox Code Playgroud)
我真的不明白readdir前面的整个{...}是做什么的,或者更确切地说,它是如何做它正在做的事情.当然,我可以看到两个值相互比较.但是整个事情是什么样的语法结构?$ a和$ b来自哪里?我可以在Perl书中看到哪些标题?这是一个特殊的东西,只适用于sort {}还是有其他方法可以使用这个构造?
在其他语言中我会写
testvar = onecondition OR anothercondition;
Run Code Online (Sandbox Code Playgroud)
如果任何一个条件,testvar为true.但在Perl中,这并不像预期的那样有效.
我想检查一个内容变量为空或者与特定正则表达式匹配的情况.我有这个示例程序:
my $contents = "abcdefg\n";
my $criticalRegEx1 = qr/bcd/;
my $cond1 = ($contents eq "");
my $cond2 = ($contents =~ $criticalRegEx1);
my $res = $cond1 or $cond2;
if($res) {print "One or the other is true.\n";}
Run Code Online (Sandbox Code Playgroud)
我希望$ res包含"1"或者在用if()测试时可以证明为真.但它包含空字符串.
我怎样才能在Perl中实现这一目标?
有谁知道在XML :: LibMXL中实现了哪个版本的XPath规范?
或者更重要的是,在哪里可以找到我可以在LibXML中使用的XPath函数的描述?
例如,我尝试过类似的东西
$dcDOM->findvalue('//dc:identifier[contains(@xsi:type,"URI")]');
Run Code Online (Sandbox Code Playgroud)
这看起来很好,但是
$dcDOM->findvalue('//dc:identifier[matches(@xsi:type,"URI")]');
Run Code Online (Sandbox Code Playgroud)
才不是.
从那一点开始,我们必须假设它最多支持XPath 1.0或1.0/2.0的某个子集.
是否有一个整洁的页面列出和描述了所有内容?
我发现这个代码在某处,perlin噪声发生器,我想:
static {
for(int i=0; i<512; i++) perm[i]=p[i & 255];
}
Run Code Online (Sandbox Code Playgroud)
静电有什么作用?它在很多其他地方也被垃圾邮件发送了......代码实际上是用静态{}构建的.我丢失了原来的代码,所以这是我唯一的东西,但它就像上面的代码:那里没有变量声明,这就是为什么我没有得到它.
我需要在Perl哈希中找到所有值的最大值.我不需要键,只需要最高值,这样我就可以增加它并返回一个比以前更高的新值.世界上最简单的事情.我从这个答案中获取灵感:https://stackoverflow.com/a/2891180/2740187,并实现了这段代码:
use List::Util qw( reduce min max );
my %gid = ("abc" => 1, "def" => 1);
my $gid_ref = \%gid;
my $max_gid = reduce { $a > $b ? $a : $b } values %$gid_ref || 0;
print "$max_gid\n";
Run Code Online (Sandbox Code Playgroud)
如您所见,哈希只包含两个1作为值.那为什么打印"2"?至少它在我的机器上.
我想我只能写
my $max2 = max(values %$gid_ref) || 0;
Run Code Online (Sandbox Code Playgroud)
无论如何要获得最大值,但我真的想了解这里发生了什么.
我正在解析复杂的XML文档,一个部分可能如下所示:
<mds>
<md>
<value>
<![CDATA[<?xml version="1.0" encoding="UTF-8"?><record>...</record>]]>
</value>
</md>
</mds>
Run Code Online (Sandbox Code Playgroud)
当我解析值节点时,它实际上包含3个子节点,两个空节点和一个cdata节点.有没有办法轻松获得cdata节点,比如
my @dcvalues = $dom->findnodes("//mds/md/value");
my @cdatanodes = $dcvalues[0]->find(<some xpath that only returns cdata nodes>);
my $cdataval = $cdatanodes[0]->textContent;
Run Code Online (Sandbox Code Playgroud)
你明白了.编辑:我知道我可以在这个例子中访问cdata
my $cdatanode = $dcvalues[0]->firstChild->nextSibling;
Run Code Online (Sandbox Code Playgroud)
但后来我依赖cdata始终是第二个节点,我不确定.
我知道如何避免在一维数组中重复.
但是,我有一个数组数组,它的两行可能包含具有不同引用但具有相同值的数组.我试过这个:
sub unique {
my %seen;
grep !$seen{join('',$_)}++, @_
}
my @aa = ( ["1","2","3"],["1","2","3"],["1","2","4"] );
my @bb = unique(@aa);
print $_ for (@bb);
Run Code Online (Sandbox Code Playgroud)
它应该删除两个"123"数组中的一个,但它没有.可能是因为$ _包含引用而不是可以连接的数组?当然,我可以循环遍历$ _ referenced数组并连接所有值,然后将其用作%see hash的键.
但我怀疑在Perl中有一个非常优雅的解决方案,我还不知道......
我正在使用LibXML解析一个简单的jhove输出.但是,我没有得到我期望的价值.这是代码:
use feature "say";
use XML::LibXML;
my $PRSR = XML::LibXML->new();
my $xs=<DATA>;
say $xs;
my $t1 = $PRSR->load_xml(string => $xs);
say "1:" . $t1->findvalue('//date');
$xs=<DATA>;
say $xs;
$t1 = $PRSR->load_xml(string => $xs);
say "2:" . $t1->findvalue('//date');
__DATA__
<jhove xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://hul.harvard.edu/ois/xml/ns/jhove" xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/jhove http://hul.harvard.edu/ois/xml/xsd/jhove/1.3/jhove.xsd" name="Jhove" release="1.0 (beta 3)" date="2005-02-04"><date>2006-10-06T09:11:34+02:00</date></jhove>
<jhove><date>2006-10-06T09:11:34+02:00</date></jhove>
Run Code Online (Sandbox Code Playgroud)
如您所见,"1:"行返回一个空字符串,而"2:"返回预期日期.jhove-root-element中的什么使xpath查询无法正常工作?我甚至在XML-Spy中尝试过它,即使有完整的标题也可以.
编辑:当我从根元素中删除xmlns属性时,xpath查询工作.但那怎么可能呢?
我在Perl中有这个查询:
my $pkg="%";
my $sql = "SELECT pid, CAST(pid as UNSIGNED) AS l FROM xmld ORDER BY l WHERE pkg LIKE ?";
my $files_ref = $dbh->selectcol_arrayref($sql, undef, $pkg);
Run Code Online (Sandbox Code Playgroud)
它崩溃了:
DBD :: mysql :: db selectcol_arrayref失败:您的SQL语法中有错误; 检查与您的MySQL服务器版本对应的手册,以便在第1行的'WHERE pkg LIKE'%'附近使用正确的语法...
我一直在看这个陈述几个小时,尝试了各种各样的事情,但没有运气.那个额外的单引号来自哪里?如何摆脱它?