使用perl的多个正则表达式

Leh*_*ann 4 regex perl undef

嗨,这个网站已经帮我几次修复我在perl的问题.这是我第一次提出问题,因为我无法在谷歌和堆栈溢出中找到答案.

我想要做的是获取两个单词之间的内容.但他们必须匹配的模式正在发生变化.我正在尝试获取产品详细信息.品牌,描述,名称等.我试图在另一个之后进行正则表达式匹配,但遗憾的是这不起作用,因为$ 1保持定义.试图取消$ 1变量取消给我错误消息"只读"这是合乎逻辑的.我将在下面发布我的代码,也许有人有一个想法如何让它工作.

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use IO::File;
use utf8;
my $nfh = IO::File->new('test.html','w');
my $site = 'http://www.test.de/dp/';
my $sku = '1550043196';
my $url = join('',$site,$sku);
my $content = get $url;
my $name = $1 if ($content =~ m{<span id="productTitle" class="a-size-large">(.*?)</span>}gism);
print "$name\n";

# My attempt of undefying 
#undef $1;

my $marke = $1 if ($content =~ m{data-brand="(.*?)"}gism);
print "$marke\n";
Run Code Online (Sandbox Code Playgroud)

有什么建议?

jm6*_*666 5

首先,永远不要使用如下构造:

my $var = $val if( $some );
Run Code Online (Sandbox Code Playgroud)

根据文件:

注意:my,state我们使用语句修饰符条件或循环结构修改的行为(例如,我的 $ x if ...)是未定义的.my变量的值可以是undef,任何先前分配的值,或者可能是其他任何值.不要依赖它.perl的未来版本可能会与您尝试使用的Perl版本有所不同.这里是龙.

m//操作者,当/g被指定的组合在列表环境,它返回被任何捕获括号中的正则表达式匹配的子串的列表.所以,正如@Сухой27在上面的评论中所说,你应该使用:

my ($some) = $str =~ m/...(...).../g;
Run Code Online (Sandbox Code Playgroud)

举个简单的例子:

use strict;
use warnings;

my $u="undefined";
my $str = q{some="string" another="one"};

#will match
my ($m1) = $str =~ m/some="(.*?)"/g;
print 'm1=', $m1 // $u, '= $1=', $1 // $u, "=\n";

#will NOT match
my ($m2) = $str =~ m/nothere="(.*?)"/g;
print 'm2=', $m2 // $u, '= $1=', $1 // $u, "=\n";

#will match another
my ($m3) = $str =~ m/another="(.*?)"/g;
print 'm3=', $m3 // $u, '= $1=', $1 // $u, "=\n";
Run Code Online (Sandbox Code Playgroud)

打印:

m1=string= $1=string=
m2=undefined= $1=string=   #the $1 hold previously matched value
m3=one= $1=one=
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,$1遗骸,当匹配不成功时.该文件说:

这些特殊变量,像%+散列和编号匹配变量($1,$2,$3等)动态作用域直到封闭块的端部,或直至下一个成功的匹配,以先到者为准.(参见perlsyn中的复合陈述.)

注意:Perl中的失败匹配不会重置匹配变量,这使得编写测试一系列更具体案例的代码更容易,并记住最佳匹配.

因此,如果您不想$1定义,可以将匹配的部分包含在一个块中,例如:

use strict
use warnings;

my $u="undefined";
my $str = q{some="string" another="one"};
my($m1,$m2,$m3);

{($m1) = $str =~ m/some="(.*?)"/g;}
print 'm1=', $m1 // $u, '= $1=', $1 // $u, "=\n";

{($m2) = $str =~ m/nothere="(.*?)"/g;}
print 'm2=', $m2 // $u, '= $1=', $1 // $u, "=\n";

{($m3) = $str =~ m/another="(.*?)"/g;}
print 'm3=', $m3 // $u, '= $1=', $1 // $u, "=\n";
Run Code Online (Sandbox Code Playgroud)

打印什么

m1=string= $1=undefined=
m2=undefined= $1=undefined=
m3=one= $1=undefined=
Run Code Online (Sandbox Code Playgroud)

PS:我不是Perl大师,也许其他人会扩展/纠正这个答案.