Обычно парсятся целые страницы, но иногда нужно написать функцию или даже просто распарсить всего-лишь один тег.
Рассмотрим задачу: есть тег textarea, у которого может быть сколько угодно совершенно разных атрибутов. Сколько, каких и каков их порядок — не известно. Задача — получить хэш, ключами которого будут имена атрибутов, а значениями — их значения (опа, каламбур).
В эксплуатацию вводятся кириллические. Что это, зачем и как — поразмыслю в этом посте.
Сегодня ко мне в асю стукнул человек.
Сказал, что нашел мой блог и спросил не могу ли я помочь написать грабер. Я, конечно, предварительно согласился. Ведь и человеку помочь — дело хорошее и денег заработать — тоже неплохо.
Но дальше история приобретала печальный оборот.
Дано: текст с кривым-кривым и неправильным вообще html.
Задача: расставить в этом html ссылки на заданный адрес по заданному слову. Сложность в том, что если это слово стоит в каком-то контейнерном теге, кроме <p>, его трогать не надо.
Недавно узнал о существовании специальной переменной Perl, которая называется "_". Да-да, это именно "_", а не $_.
Переменная $_, как известно, является "местоимением" в Perl. Например, рассмотрим предложение: "Брать каждый новый лепесток из цветка и выбрасывать его." В этом предложении слово "его" соответствует переменной $_. Сейчас объясню.
На Perl это будет выглядеть так:
foreach(@flower) {
print("Выбросил $_<br>\n");
}
Надеюсь, понятно. Переменной $_ присваивается временное значение при итерациях цикла, например. К этой переменной обращаются некоторые функции если не указано иное. Например:
foreach(@flower) {
s/blue/pink/g;
print("Выбросил $_<br>\n");
}
В этом случае мы заменяем для каждого лепестка цвет blue на pink. Такая запись эквивалентна такой:
$_ =~ s/blue/pink/g;
Теперь о переменной _.
Узнал от своего начальника и заядлого перловика о ней. Полез и почитал сам. Оказалось, что это не совсем переменная. Это дескриптор файла, что развеивает магию вокруг переменной без префикса "$".
Так что же делает этот дескриптор и откуда берется?
Рассмотрим код:
if(-e "./path2/file.dat") {
if(-z _) {
print "OK";
}
}
Сначала мы проверяем файл на существование. Но потом мы проверяем _ на предмет пустоты.
Дело в том, что для получения атрибутов команды -e, -d, -z и подобные неявно вызывают функцию stat для файла. И просто возвращают один из элементов результирующего массива. (Ведь мы помним, что функция stat возвращает массив)
Затем происходит кэширование результатов изъятия атрибутов для дескриптора файла _. И когда мы вызываем новую проверку атрибута файла для _, функция stat уже не вызывается, что несколько экономит время и ресурсы, да.
Вот такая небольшая хитрость.