Perl m оператор вопрос - PullRequest
       1

Perl m оператор вопрос

0 голосов
/ 30 марта 2011

Почему этот код печатает 51, а не 26?Я пытаюсь извлечь "ценности".Вот что я хочу (смелый):Andaman & Nicobar

Согласно определению m с оператором g в контексте списка должен возвращаться шаблон в паратезах?

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 ]

6 голосов
/ 30 марта 2011

Каждое совпадение / g начинается с того места, где было прервано предыдущее, но поскольку вы используете утверждения нулевой ширины, вы фактически не потребляете ". Так что

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

тоже считается совпадением.

Do:

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

вместо этого. Обратите внимание, что если есть круглые скобки, m // g в случае успеха возвращает их содержимое в контексте списка.

2 голосов
/ 30 марта 2011

лучше будет:

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

в этом случае

1 голос
/ 30 марта 2011

Регулярное выражение захватывает, как вы думаете, названные города, а также текст между конечной кавычкой одного города и начальной цитатой следующего города. Я предполагаю, что если вы не сделаете утверждение нулевой ширины в конце двойной кавычки, ваша проблема исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...