首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl正则表达式被忽略了吗?

Perl正则表达式被忽略了吗?
EN

Stack Overflow用户
提问于 2011-11-09 07:17:39
回答 4查看 206关注 0票数 0

对不起,如果这不值得堆叠溢出,但我很困惑。这是我的代码:

代码语言:javascript
复制
#Search tmpData for a <whack> tag and replace with REPLACEMENTSTRING (this works)
$tmpData =~ s/<\s*whack\s+([^\/>]*)(\/?>)/"$REPLACEMENTSTRING"/i;

if($defaultData ne '') {
print "pre $1 And $2... '$&'\n";

#Search for data inside <whack> tag and closing tag </whack> and remove them.
$tmpData =~ s/$defaultData<\/whack>$//;
print "FOUND $1 And $2... '$&'\n";  

对于那些不知道的人,$&显示正则表达式匹配。问题是第二个正则表达式似乎根本没有执行:最后一个print语句显示第一个正则表达式的所有值。您可能希望$&在这里进行修改。对吗?

我的测试数据是:$tmpData is: yo "WHACKREPLACEMENT-idname2"helloworld</whack>

在第一个正则表达式之后。$defaultData is: helloworld

我试着将这段代码从主脚本中提取出来,放到一个不严格的测试文件中,它起了作用:

怎么一回事?!谢谢!

编辑--我不知道如何更清楚地说明这一点,所以我想在出现错误时发布调试器的输出:

主语:(c:\exec\webwhack.pl:109):$tmpData =~ s/$defaultData$//;

DB<2> p $tmpData,$defaultData

"WHACKATAG2837293REPLACEMENT-idname2"removeMe

removeMe

DB<3> n

主语:(c:\exec\webwhack.pl:110):打印“发现1美元和2美元.$&‘\n”;

DB<3> p $tmpData,$defaultData

"WHACKATAG2837293REPLACEMENT-idname2"removeMe

removeMe

因此,您可以看到,进入正则表达式"removeMe“存在于字符串的末尾。从正则表达式中出来--好像什么都没变。:(

EDIT2

我还应指出,所有这些声明都是用以下文字包装的:

代码语言:javascript
复制
while( $tmpData =~ m/<\s*whack\s+([^\/>]*)(\/?>)/ig) { ... }

循环播放

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-09 07:33:07

很难准确地说没有$defaultData$tmpData的值,但是当您的$defaultData模式在第二个=~中没有匹配时,您就会看到这一点。

毕竟,曼佩尔瓦说:

$&上一次成功的模式匹配匹配的字符串

我会这样构造它:

代码语言:javascript
复制
#Search tmpData for a <whack> tag and replace with REPLACEMENTSTRING (this works)
$tmpData =~ s/<\s*whack\s+([^\/>]*)(\/?>)/"$REPLACEMENTSTRING"/i;

if($defaultData ne '') {
  print "pre $1 And $2... '$&'\n";

  #Search for data inside <whack> tag and closing tag </whack> and remove them.
  if($tmpData =~ s/$defaultData<\/whack>$//) { 
    print "FOUND $1 And $2... '$&'\n";  
  } else { 
    print "NOT FOUND";
  } 
}
票数 2
EN

Stack Overflow用户

发布于 2011-11-09 07:40:33

我猜您的第一个替代操作正在更改$tmpData,因此第二个替代模式不匹配。

尽管如此,我认为您可以使用一个替代操作简化您的代码,如果您只是想像这样抓取您的照片中的内容:

代码语言:javascript
复制
if ($tmpdata =~ s/<whack>(.*?)<\/whack>/$1/) {

    print "Found whack tag value: $tmpdata\n";
}

更新:修正了斜杠

票数 1
EN

Stack Overflow用户

发布于 2011-11-09 07:41:07

为什么第二个正则表达式要执行?"WHACKREPLACEMENT-idname2"helloworld不以</whack>结尾。请记住,$1、$2和$&包含上次成功匹配的值,在您的示例中,这是第一个regexp。

$1$2$&$tmpData之所以没有改变,是因为您的第二个regexp与$tmpData中的任何内容都不匹配。如果您修改了代码以显示相关代码,以便我们可以看到发生了什么,那么很容易指出原因。相反,你已经发布了更多无关的信息。

让我向您展示,在清楚发生了什么的情况下,贴出代码是多么容易:

代码语言:javascript
复制
#!/usr/bin/perl -w

use strict;

my $defaultData = "yo";
my $tmpData = "$defaultdata <whack id='IcedDante'>helloworld</whack>";
my $REPLACEMENTSTRING = "WHACKREPLACEMENT-idname";

#Search tmpData for a <whack> tag and replace with REPLACEMENTSTRING (this works)

$tmpData =~ s/<\s*whack\s+([^\/>]*)(\/?>)/"$REPLACEMENTSTRING"/i;

if($defaultData ne '') {
    print "pre $1 And $2... '$&'\n";

    #Search for data inside <whack> tag and closing tag </whack> and remove them.
    $tmpData =~ s/$defaultData<\/whack>$//;
    print "FOUND $1 And $2... '$&'\n";  
}

(我试图从你给我们的信息中重建你的代码,但这是不可能的。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8061553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档