Как извлечь в хеш - PullRequest
       6

Как извлечь в хеш

0 голосов
/ 07 января 2011

Эй, я не уверен, почему мой код не работает.Я пытаюсь извлечь некоторую информацию из html-файла, который содержит.

    Junk id="i_0100_1" alt="text1, text2 | text3" 
Junk Junk id="i_0100_2" alt="text1, text2 | text3"

Я использую это для этого.

my $file = "page.html";

open (LOGFILE, $file);
my %hash;
while (my $line = <LOGFILE>)     
{ 
    %hash = $line =~ /^\s*id="([^"]*)"\s*alt="([^"]*)"/mg;
    print $hash{'id'};
}   
close LOGFILE;

Чего мне не хватает?

Ответы [ 5 ]

4 голосов
/ 07 января 2011
  1. По другому предложению: возможно, вы не открываете файл. Проверьте возврат или используйте autodie.
  2. Отсканированный HTML не может быть в нижнем регистре. Используйте i флаг регулярного выражения.
  3. Согласно правилам HTML, не все значения атрибутов должны заключаться в кавычки.
  4. Также в соответствии с правилами HTML, '=' не обязательно должен идти сразу после имени атрибута или непосредственно перед значением.
  5. Они не всегда могут встречаться в одном и том же порядке или рядом друг с другом.
  6. Вы используете регулярные выражения для разбора HTML!

# 6 - краткое изложение проблем с 3-5. Решение, которое я предлагаю, это использовать HTML::Parser или HTML::TreeBuilder

2 голосов
/ 07 января 2011

В дополнение к предложениям Axeman (главное из которых - не разбирать HTML самостоятельно):

  1. Якорь ^ предотвратит совпадение вашего регулярного выражения, так как "id" не находится на начало строки.
  2. Вы сбрасываете данные в %hash при каждом назначении, что, вероятно, не то, что вы хотите.
  3. Вы печатаете значение для ключа "id", но не сохраняете его в хэше. То, что вы храните (или будет, если шаблон когда-либо совпадал), это значение id атрибут.
2 голосов
/ 07 января 2011

Вы всегда должны проверять возвращаемое значение после открытия файла:

open LOGFILE, $file or die $!;

Кроме того, якорь ^, вероятно, не нужен в регулярном выражении.

1 голос
/ 07 января 2011

Вам не нужно ^\s* в начале

попробуйте это id\=\"(.*)\"\salt=\"(.*)\"

Демо http://rubular.com/r/ySG0XO5jbJ

РЕДАКТИРОВАТЬ

Попробуйте удалитьмодификаторы /mg

0 голосов
/ 07 января 2011

Это сделал трюк:

my $file = "page.htm";

open (LOGFILE, $file);
my %hash;
while (my $line = <LOGFILE>)     
{ 
    %hash = $line =~ /\s*id="([^"]*)"\s*alt="([^"]*)"/;
    for my $key ( keys %hash ) {
        my $value = $hash{$key};
        print "$key\n$value\n";
    }
}   
close LOGFILE;

Проблема была с выводом хеша и определением регулярного выражения. Спасибо Евгению, Майклу и Иш. :)

...