小编jac*_*ter的帖子

Perl:"变量不会保持共享"

我查了几个处理这个警告的答案,但他们也没有帮助我,也没有真正理解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将不会保持共享".

我不明白的是:

  1. 这个警告对我有疑虑吗?我的逻辑会在这里运作还是会发生奇怪的事情?

  2. 如果它不能按预期工作:是否可以这样做?使局部变量对嵌套子变得可见?或者将它作为参数传递更好?或者声明一个"我们的"变量是否更好?

  3. 如果我将它作为参数推送,整个对象及其所有数据(可能有几个MB)是否会被推入堆栈?或者我可以传递类似参考的东西?或者Perl是否将该参数作为参考单独处理?

  4. "变量$ foo将不会保持共享"Perl中的警告/错误在调用子例程时,有人会谈论一个匿名子,这将使这成为可能.我不明白它是如何工作的,从来没有使用过这样的东西.

  5. 我根本不理解这个解释(可能导致英语不是我的第一语言):"当调用内部子程序时,它将看到外部子程序变量的值,就像它在第一次调用外部子程序之前和期间一样. ;在这种情况下,在第一次调用外部子程序完成后,内部子程序和外部子程序将不再共享变量的公共值.":

"对外部子程序的第一次调用是完整的是什么意思?"
我的意思是:首先我称之为外部子程序.外部子调用内部子.外子当然还在运行.一旦外部子完成,内部子也将完成.那么当内部子已经完成时,这仍然适用于什么呢?那么"第一次"召唤呢?什么时候发生"第二次"通话......对不起,这个解释让我感到困惑.

对不起,有很多问题.也许有人至少可以回答其中一些问题.

variables perl local

16
推荐指数
3
解决办法
3539
查看次数

WFLYEE0040:此模块中已定义名为“...”的组件

我在 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)

我试过了:

  • 在同一台计算机上安装新的 Wildfly(V10、V13)-> 没有帮助
  • 在这台机器上安装全新的 Eclipse -> 没有帮助
  • 清理和重建所有相关项目
  • 确保部署文件夹为空并且不包含同一 WAR 的旧版本
  • 阅读此处的相关问题,这也没有帮助(他们使用 Spring):A名为“XXX”的组件已在 JBoss 7.1.1 的此模块中定义
  • 阅读并尝试此问答:Wrong dependency with EJB in JBoss Wildfly (server-clean) -> 没有帮助
  • 删除并重建本地 Maven 代表(“.m2”)-> 无效

  • 在另一台计算机上检查相同的源 -> 在一台计算机上确实有效,在另一台计算机上却给出了相同的错误

我完全不知道问题是什么,甚至可能是什么。在一台机器上,我们检查它,它运行没有错误。在其他情况下,也会发生完全相同的错误。

有人有想法吗?

java jboss wildfly

8
推荐指数
1
解决办法
8858
查看次数

return(string expr)和返回New String(string expr)之间有什么区别?

这两种方法有区别吗?

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中的字符串处理感到困惑,因为有时字符串被视为基本类型,即使它们是类实例.

java string types class object

6
推荐指数
1
解决办法
4717
查看次数

这个Perl语法构造是什么?

我有一个跟进问题,我的早期帖子按数值排序文件名.

解决方案是这段代码:

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 {}还是有其他方法可以使用这个构造?

sorting syntax perl

5
推荐指数
2
解决办法
193
查看次数

为什么"x = a或b"在Perl中不起作用?

在其他语言中我会写

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中实现这一目标?

perl if-statement boolean operators

5
推荐指数
1
解决办法
253
查看次数

在XML :: LibXML中实现了什么版本的XPath?

有谁知道在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的某个子集.

是否有一个整洁的页面列出和描述了所有内容?

xml perl xpath libxml2

5
推荐指数
1
解决办法
495
查看次数

c ++ static关键字对大括号有什么作用?

我发现这个代码在某处,perlin噪声发生器,我想:

static {
    for(int i=0; i<512; i++) perm[i]=p[i & 255];
}
Run Code Online (Sandbox Code Playgroud)

静电有什么作用?它在很多其他地方也被垃圾邮件发送了......代码实际上是用静态{}构建的.我丢失了原来的代码,所以这是我唯一的东西,但它就像上面的代码:那里没有变量声明,这就是为什么我没有得到它.

c++ java visual-c++

4
推荐指数
2
解决办法
352
查看次数

为什么减少{}没有按预期返回最大值?

我需要在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)

无论如何要获得最大值,但我真的想了解这里发生了什么.

perl hash reduce max

4
推荐指数
1
解决办法
290
查看次数

如何按节点类型获取XML :: LibXML中的子节点?

我正在解析复杂的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始终是第二个节点,我不确定.

perl cdata libxml2 xml-parsing

3
推荐指数
1
解决办法
1389
查看次数

如何避免数组数组中的重复值?

我知道如何避免在一维数组中重复.

但是,我有一个数组数组,它​​的两行可能包含具有不同引用但具有相同值的数组.我试过这个:

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中有一个非常优雅的解决方案,我还不知道......

perl unique multidimensional-array

2
推荐指数
1
解决办法
929
查看次数

为什么这个xmlns属性搞砸了我的xpath查询?

我正在使用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 xpath libxml2

1
推荐指数
1
解决办法
444
查看次数

为什么这是一个SQL语法错误?

我在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'%'附近使用正确的语法...

我一直在看这个陈述几个小时,尝试了各种各样的事情,但没有运气.那个额外的单引号来自哪里?如何摆脱它?

mysql perl

0
推荐指数
1
解决办法
94
查看次数