Я учу себя Perl и Regex, читая превосходные Джеффри Фридла Освоение регулярных выражений .
При попытке выполнить упражнение «Утилита небольшой почты», начиная со стр. 53, я столкнулся с проблемой незнания, как сохранить содержимое файла в переменную , начиная со смещения .
Так вот мой (сокращенный) сценарий.
my ($body, $line, $subject);
$body = $line = $subject = "";
open(MYFILE, "king.in") || die("Could not open file!");
# Read the file's content line by line
while ($line = <MYFILE>)
{
# An empty line marks the beginning of the body
if ($line =~ m/^\s+$/ ) {
# HERE IS THE ISSUE
# Save the file content starting from the current line
# to the end of the file into $body
last;
}
if ($line =~ m/^subject: (.*)/i) {
$subject = $1;
}
# Parse additional data from the mail header
}
close(MYFILE);
print "Subject: Re: $subject\n";
print "\n" ;
print $body;
Я провел некоторые онлайн-исследования, но не смог выяснить, как поместить оставшуюся часть файла (то есть, тело письма) в переменную $ body.
Я понял, что могу получить текущую позицию в файле в байтах, используя $pos = tell(MYFILE);
В конце концов я получил работающее, но неудовлетворительное решение размещения строк файла первым в массиве.
Как сохранить содержимое файла, начиная со смещения (в виде номера строки или байтов), в $ body?
Edit:
Мое решение - как предусмотрено vstm - это использовать $body = join("", <MYFILE>)
для чтения в остальной части файла при обнаружении пустой строки, отмечающей начало тела.
Весь сценарий, который я написал, можно найти здесь .
Хотя сейчас это прекрасно работает для меня, я все же хотел бы знать, как сказать (изящно) в Perl: «дайте мне строки от x до z этого файла».
Спасибо всем за советы.