嗨,这个网站已经帮我几次修复我在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)
有什么建议?
首先,永远不要使用如下构造:
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大师,也许其他人会扩展/纠正这个答案.