Недавно узнал о существовании специальной переменной 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 уже не вызывается, что несколько экономит время и ресурсы, да.
Вот такая небольшая хитрость.