November 19, 2004
Задачи 3: Файлове, директории, функции, references
Това е третият комплект задачи, към лекциите за работа с файлове, функции и references. Някои от тези задачи ще разгледаме на упражнението в понеделник, 22 ноември.
Този път задачите са малко по-практически ориентирани - в тази и следващите серии задачи постеменно ще се доближаваме до създаване на прост архиватор. Ако четете това на главната страница на сайта, изберете "Още от..." по-долу, за да видите самите задачи.
Задача 1: Създаване на директория и "родителите" й
Да се напише функция safe_mkdir($), която приема като параметър път към директория и, ако тя не съществува, я създава, като създава и по-горните директории, ако и те не съществуват. Така, ако имаме празна директория perl, то safe_mkdir("perl/files/slides") ще създаде и perl/files, и perl/files/slides. Функцията трябва да върне истинна стойност, ако директориите са създадени успешно или вече са съществували, и неистина, ако е възникнала някаква грешка в процеса на създаване.
При анализа на подадения път към директория и разделянето му на по-горни директории в тази задача предполагаме, че различните компоненти (директории) от името са разделени с наклонена черта - "/". Ако в пътя има две или повече наклонени черти една след друга, те трябва да бъдат игнорирани (perl/files//slides е еквивалентно на perl/files/slides). Ако пътят завършва с наклонена черта, тя също трябва да бъде игнорирана (perl/files/slides/ е еквивалентно на perl///files/slides).
Задача 2: Изчитане на дърво от файлове и директории в паметта
Да се създадат функции mem_store_dir($ $) и mem_store_file($ $), които обхождат дърво от файлове и директории и запазват информация за него в структура от данни в паметта - хеш с ключове имената на файлове/директории в определена директория. За всеки файл трябва да се запазят първите три реда (или по-малко, ако няма три) в анонимен масив, а за всяка директория - също такъв хеш с ключове имена на файлове и директории, съдържащ информация за нея и за поддиректориите й.
-
mem_store_file SELF, FILEPATH
Прочита първите три реда от файл, пътят към който е зададен във FILEPATH. При успешно изпълнение връща reference към масив, съдържащ прочетените редове. При неуспех записва съобщение за грешка в стойността с ключ 'error' на хеша, reference към който е подаден в SELF, и връща като резултат недефинираната стойност.
Така, ако имаме хеш %self = () и изпълним $file = mem_store_file(\%self, "files/examples/examples.0.html"), то резултатът ще бъде едно от следните:
- ако всичко е наред, $file ще е reference към масив, в който са записани първите до три реда от файла files/examples/examples.0.html;
- ако нещо не е наред, $file няма да бъде дефиниран, а $self{'error'} ще съдържа съобщение за грешка.
-
mem_store_dir SELF, DIRNAME
Изчита съдържанието на директория, пътят към която е зададен в DIRNAME, и връща reference към хеш с ключове имената на файловете и поддиректориите на дадената директория (само тези, които се намират пряко в нея, не в нейните поддиректории):
- за всеки файл, стойността на елемента е reference към масив, съдържат първите до три реда от файла;
- за всяка директория, стойността на елемента е reference към хеш, съдържат информация за съдържанието й в същия формат;
- всеки елемент от директорията, който не е нито файл, нито поддиректория, се игнорира.
Ако изчитането на съдържанието на директорията и нейните поддиректории е било успешно, mem_store_dir() връща reference към гореописания хеш. Ако е възникнала някаква грешка, функцията записва подходящо съобщение в елемента 'error' на хеша, reference към който е подаден в SELF, и връща като резултат недефинираната стойност.
Възможен резултат от успешното изпълнение на $dir = mem_store_dir("files") би могло да бъде:
$dir = { 'examples' => { 'example.0.html' => [ "<html>\n", " <head>\n", " <title>Example 0</title>\n" ], "example.1.html" => [ "<html>\n", "</html>\n" ] }, 'README' => [ "This is the files/ directory.\n", "It contains various files pertaining to the Practical Perl Programming\n", "course - some examples, some slides, and so on.\n" ], "emptydir" => { } };
Задача 3: Запазване на дърво от директории и файлове във файл
Да се създадат функции store_file($ $ $) и store_dir($ $ $), които извеждат на стандартния изход информация за прочетените от mem_store_file() и mem_store_dir() в определен формат. При успешно обхождане на подадените данни функциите връщат истинна стойност, а при неуспешно - връщат недефинираната стойност и поставят подходящо съобщение за грешка в елемента 'error' на хеша, reference към който е подаден като първи параметър.
-
store_file SELF, FILENAME, FILEREF
Обработва масива, създаден от mem_store_file(), reference към който е подаден във FILEREF. Името на файла е подадено във FILENAME. Функцията извежда на стандартния изход информация за името на файла и прочетените от него редове в следния формат:
FILE numlines filename First line Second line Third line END FILE
В изхода numlines се замества с число, показващо колко реда са прочетени от файла, filename се замества с името на файла, след което на отделни редове се записват прочетените от файла редове, като всеки от тях задължително завършва със символ за нов ред. След последния ред се извежда един ред, съдържащ END FILE.
-
store_dir SELF, DIRNAME, DIRREF
Обработва хеша, създаден от mem_store_dir(), reference към който е подаден в DIRREF. В DIRNAME е името на директорията. Функцията извежда на стандартния изход информация за директорията в следния формат:
DIR numentries dirname first entry second entry ... last entry END DIR
В изхода numentries е броят на файлове и поддиректории в тази директория, а dirname е името на директорията. След началния ред се извежда информация за всеки елемент от директорията (всеки елемент от подадения хеш DIRREF) чрез извикване или на store_file(), или на store_dir().
Възможен резултат от извикване на store_dir(\%self, "files", $dir); е:
DIR 3 files DIR 2 examples FILE 3 example.0.html <html> <head> <title>Example 0</title> END FILE FILE 2 example.1.html <html> </html> END FILE END DIR FILE 3 README This is the files/ directory. It contains various files pertaining to the Practical Perl Programming course - some examples, some slides, and so on. END FILE DIR 0 emptydir END DIR END DIR