Perl m运算符问题

时间:2011-03-30 18:08:03

标签: perl

为什么此代码打印51而不是26?我正试图提取“价值观”。 这就是我想要的(粗体):< option value =“ Andaman& Nicobar ”> Andaman&尼科巴< /选项>

根据定义m在列表上下文中使用g运算符应该在parantheses中返回模式吗?

my $firstpage=<<'EOF';
 <option value="Andaman & Nicobar">Andaman & Nicobar</option>
            <option value="Andhra Pradesh">Andhra Pradesh</option>
            <option value="Assam">Assam</option>
            <option value="Bihar">Bihar</option>
            <option value="Calcutta Telecom District">Calcutta Telecom District</option>
            <option value="Chennai Telecom District">Chennai Telecom District</option>
            <option value="Chhattisgarh">Chhattisgarh</option>
            <option value="Gujarat">Gujarat</option>
            <option value="Haryana">Haryana</option>
            <option value="Himachal Pradesh">Himachal Pradesh</option>
            <option value="Jammu & Kashmir">Jammu & Kashmir</option>
            <option value="Jharkhand">Jharkhand</option>
            <option value="Karnataka">Karnataka</option>
            <option value="Kerala">Kerala</option>
            <option value="Madhya Pradesh">Madhya Pradesh</option>
            <option value="Maharashtra">Maharashtra</option>
            <option value="North East I">North East I</option>
            <option value="North East II">North East II</option>
            <option value="Orissa">Orissa</option>
            <option value="Punjab">Punjab</option>
            <option value="Rajasthan">Rajasthan</option>
            <option value="Tamilnadu">Tamilnadu</option>
            <option value="UP East">UP East</option>
            <option value="UP West">UP West</option>
            <option value="Uttaranchal">Uttaranchal</option>
            <option value="West Bengal">West Bengal</option>
EOF

my @cities=$firstpage=~m{(?<=")([^"]*)(?=")}gs;

print scalar @cities;

3 个答案:

答案 0 :(得分:6)

每个/ g匹配从上一个停止的地方开始,但由于你使用零宽度断言,你实际上并没有消耗“。所以

">Andaman & Nicobar</option>
        <option value="

也被视为匹配。

执行:

my @cities = $firstpage =~ m/"([^"]*)"/gs;

代替。请注意,如果有捕获括号,则只有m // g在列表上下文中成功返回这些内容。

答案 1 :(得分:2)

更好的是:

my @cities=($firstpage=~/value="([^"]+)"/gs);

在这种情况下

答案 2 :(得分:1)

正则表达式正在抓住您认为引用的城市,以及一个城市的最终引用与下一个城市的起始引用之间的文本。我假设如果你没有在末尾双引号上进行零宽度断言,你的问题就会消失。