Файлове
Отваряне
CODE1
2
3
4
5
6
7
| $stuff="c:/scripts/stuff.txt";
open (STUFF, $stuff) or die $!;
while (<STUFF>) {
print "Line number $. is : $_";
} |
Задаваме във един скалар пътя до даден файл. Функцията open има две променливи, който трябва да се зададат. Първата е името, което ще се даде на отворения файл, което ще се използва за достъп до него, наричано още filehandle. Втората променлива е името на файла, в случая скалара $stuff го съдържа. Функцията die прекъсва програмата и изкарва последната системна грешка ($!), ако отварянето на файла не е било успешно.
Предполагам вече се досещате какво е това - while (<STUFF>). <> - този оператор наричан диамант служи за четене от файлове. В него се поставя filehandle за да се прочита файла. Функцията while прочита един ред от файла изпълнява нещо с него и после пак докато се стигне до последния ред. Специалната променлива $. - съдържа номера на, реда от който се чете в момента.
Запис
CODE1
2
3
4
5
6
| $out="c:/scripts/out.txt";
open OUT, ">$out" or die "Cannot open $out for write :$!";
for $i (1..10) {
print OUT "$i : The time is now : ",scalar(localtime),"n";
} |
В този скрипт първо отваряме файл и го означаваме с filehandle OUT. Функцията for се изпълнява 10 пъти, като всеки път записва във файла out.txt текущата дата и час. Когато на print му се посочи даден filehandle, в случая OUT, тя знае че записите трябва да се правят в този filehandle. Ако не е зададен filehandle, използва по подразбиране STDOUT, което е монитора на компютъра.
@ARGV: Аргументи от командния ред
Perl притежава специален масив наречен @ARGV. Това е списък от аргументи следващи името на скрипта на командния ред. Стартирайте следния код:
CODE1
2
3
4
5
| perl myscript.pl hello world how are you
foreach (@ARGV) {
print "$_n";
} |
Друг начин да направите същото е :
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| while (<>) {
print ;
}
или:
print <> ;
Директории
glob
@fa=<C:/*.*>; @fa=<C:/*.html>; @ga=glob ("C:/*.com"); @ga=glob ("$ааа/*.com"); open(SESAME, "filename"); open(SESAME, "<filename"); open(SESAME, ">filename"); open(SESAME, ">>filename"); open(SESAME, [/quote] output-pipe-command"); # изпраща информация
open(SESAME, "input-pipe-command [quote]); # приема информация
$dir=shift; # shifts @ARGV
chdir $dir or die "Can't chdir to $dir:$!n" if $dir;
while (<*>) {
print "Found a file: $_n" if -f;
} |
Функцията chdir променя текущата директория, от която може да се чете, на друга подадена на chdir, в случая, която е зададена от скалара $dir, който пък си взима стойността от командния ред. След това while прочита всички файлове в текущата директория, преминава ги през теста -f, и ако са файлове се изпечатват на екрана.
CODE1
2
3
4
5
6
7
8
| $dir =shift;
$type='txt';
chdir $dir or die "Can't chdir to $dir:$!n" if $dir;
while (<*.$type>) {
print "Found a file: $_n";
} |
Тук в директорията ще се търсят файлове само с разширение зададено от $type, което в случая е txt.
readdir - как да четем от директория
Има и фукция readdir, с която може да направим по друг начин горния пример:
CODE1
2
3
4
5
6
7
| $dir= shift || '.';
opendir DIR, $dir or die "Can't open directory $dir: $!n";
while ($file= readdir DIR) {
print "Found a file: $filen";
} |
Първата разлика с горния пример, е че ако няма стойност в @ARGV, то $dir = ., което ще е текущата директория. След това отваряме директорията, анаголично на командата open използвана за файлове, но тук е opendir и задаваме възможност, ако директорията не може да бъде отворена то да нои се съобщи. Функцията readdir прочита съдържание на един ред и го подава на скалара $file.
@files=readdir(DIR);
По този начин се прочита цялото съдържание на директорията и попълваме с нея масива @files.
За да затворим един filehandle на файл или директория използваме close или closedir.
Функциите telldir и seekdir
По-долу е представен работещ скрипт, който ще Ви даде представа за използването и значението на двете функции telldir и seekdir.
- Променяме местоположението и вече всички файлове който ще отваряме
- ще се отварят от директорията D:/
chdir "D:/";
- Отваряме директорията . - което означава, че ще отворим D:/
opendir (GLAV,".");
- Прочитаме всеки файл или директория който се намират в D:/ (не трябва да Ви смущава, че това е
- дял на диска, просто така ми е по удобно за писане - разглеждайте го като директория
- все едно, че е C:/my documents/mitko/
while ($a=readdir GLAV) {
- Подаваме на $b къде се намира манипулатора на директорията в момента
- Това е число което отговаря на файл или директория която е прочетена последна
$b=telldir GLAV;
- Изпечатваме дадения файл или директория и позицията му
print "$an$bn";
- Създаваме масива @dirtell който ще съдържа всички позиции на файловете и директориите в D:/
- за да може да ги използваме после с функцията seekdir
push @dirtell,$b;
}
- По-долу на мястото на XXX в $dirtell[XXX] въведете някаква стойност валидна за дължината на масива
- и ще видите, че ще бъде прочетена файла или директорията който отговаря на посочената стойност
CODE1
2
3
| seekdir GLAV,$dirtell[XXX];
$v=readdir GLAV;
print "$vn" |