dzgn&concpt::jr*
 



Набор примери за <ФАЙЛОВЕ
  


Пример 0

 

Демонстрира четене на данни от стандартния вход (STDIN) с "диамантения" оператор (<>) за вход. При изпълнение без параметър, входа се извършва или от STDIN или последователно от файловете, подадени като параметри след името на програмата. @ARGV е масива, съдържащ параметрите подадени на програмата. Разбира се, той може да бъде променян от самата програма, като по този начин се симулира подаването на параметри. Последното изпозлваме, за да форсираме четенето с <> да става от файловете example.0.pl и example.1.pl. Пробвайте да стартирате примера с и без параметри.
 

source code ( example.0.pl ) output

#!/usr/bin/perl

# Четене на данни от STDIN в скаларен контекст
print "Enter data ('ENTER' for end):\n";
$a = <STDIN>;
print "Inputted: $a \n";

# Четене на данни от STDIN в списъчен контекст
print "Enter data ('EOF' symbol for end):\n";
@b = <STDIN>;
print "Inputted:\n", @b;

# Четене на данни в скаларен контекст
$a = <>;
print "Inputted: $a \n";

# Четене на данни в списъчен контекст
@b = <>;
print "Inputted:\n", @b;

# Изчакване за ENTER от STDIN
<STDIN>;

# Масивът @ARGV съдържа параметрите подадени на всяка
# програма и може да бъде променян

@ARGV = ("example.0.pl","example.1.pl");
while (<>) {
    print "line: $_";
}

изходът е твърде дълъг, а и зависи от входа и за това не е публикуван

 

 

Пример 1

 

Примерът демонстрира съкратения запис за четене на данни от стандартния вход и употребата на chomp (забележете резултата при второто четене на данните).
 

source code ( example.1.pl ) output
#!/usr/bin/perl

# Чете до EOF
print "Enter data:\n";
while (defined($line = <STDIN>)) {
    print $line;
}

print "\nEnter data:\n";
# Чете до EOF, но в по-кратък запис
while (<STDIN>) {
    chomp;
    print;
}

Enter data:
test line
test line
^Z

Enter data:
test line 2
test line 2test line 3
test line 3^Z

 

 

Пример 2

 

Примерът показва употребата на операторите за изход - print, printf, както и за форматиране на стринг sprintf. По подразбиране print и printf използват STDOUT за изход.

 

source code ( example.2.pl ) output
#!/usr/bin/perl

# print връща true, ако е извела успешно съобщението
$a = print("hello ", "chixen", "\n");

# print може да получава списък от параметри, но грешно
# поставените скоби променят контекста

print (2+3),"hello\n";                 
# грешно, принтира само 5
print ((2+3),"hello\n");
print 2+3,"hello","\n";

# printf извежда форматиран стринг и връща true при успех
printf ("%.2f\n", 3.3-2);
# sprintf връща форматирна стринг, тя не е операция за
# изход

print sprintf ("%.2f\n", 3.3-2);

hello chixen
55hello
5hello
1.30
1.30

 

 

Пример 3

 

Демонстрира различните режими, в който може да се отвори даден файл - за четене, писане и добавяне. При последните два режима, ако файлът не съществува, се създава. Програмата де факто, копира example.3.pl в test.3.pl, след което добавя съдържанието на първия още веднъж в края на test.3.pl.
 

source code ( example.3.pl ) output

#!/usr/bin/perl

# Отваря файл за четене, проверява за грешка
open (FILE, "example.3.pl") || die "Error opening file: $!";
# Изчита всички редове от файла
@file_lines = <FILE>;
close (FILE);

# Отваря файл за писане, проверява за грешка
open (FILE, ">test.3.pl") || die "Error opening file: $!";
print STDOUT @file_lines;
# Пише във файла
print FILE @file_lines;
close (FILE);

# Отваря файл за добавяне, проверява за грешка
open (FILE, ">>test.3.pl") || die "Error opening file: $!";
print FILE @file_lines;
close (FILE);

изходът е sosurce кода на example.3, които се вижда в ляво от това, което четете в момента :)

 


Пример 4

 

Програмта чете от стандартния вход последователно имена на файлове и използвайки оператора за проверка статуса на файлове -X, във формата му -e, проверява далй файла съществува. Прекратява изпълнение при EOF. Операторът -X има над 20 различни форми, с който може да се проверяват множество неща за файловете (пример: -d - за това дали файлът е директория, -x - дали е изпълним, -r - дали имаме права да го четем и т.н.).
 

source code ( example.4.pl ) output

#!/usr/bin/perl

print "Enter filename:";
while ($file = <STDIN>) {
  
 chomp $file;
    if (-e $file) {
        print "File: $file exists\n";
    } else {
        print "File: $file doesn't exists\n";
    }
    print "Enter filename:";
}

Enter filename:test
File: test doesn't exists
Enter filename:example.4.pl
File: example.4.pl exists
Enter filename:^Z

 


Пример 5

 

Примерът демонстрира употребата на функциите unlink и rename, съответно изпозлвание за изтриване и преименване на файлове. Ползването на unlink над директории, може да доведе до проблеми с файловата система и не е препоръчително. Поведението на rename също варира в зависимост от операционата система, която използвате.
 

 

source code ( example.5.pl ) output
#!/usr/bin/perl

# Показва съдържанието на текущата директория,
# посредством команда на OS-а (работи само за OS-и,
# където командата съществува)

print join ' ', `dir`;

# Изтрива файла създаден в предишния пример
unlink "test.3.pl";
# Изчаква ENTER от STDIN
<STDIN>;

print join ' ', `dir`;
<STDIN>;

# Създава файл
open FILE, ">test.5.txt" || die "Error: $!\n";
print FILE "test";
close FILE;

print join ' ', `dir`;
<STDIN>;

# Преименува файла
rename "test.5.txt", "test.5.bak";
print join ' ', `dir`;

резултатът не е публикуван, тъй като зависи от съдържанието на директорията, в която е изпълнен

 


Пример 6

 

Демонстрира работа с директории, както и това, че с тях се оперира подобно на файловете - с хендлъри за директории. Програмата действа подобно на ls или dir, като показва съдържанието на директориията подадена катп първи параметър. В случай, че лиспва такъв или това е невалидна директория се поакзва текущата.

 

source code ( example.6.pl ) output
#!/usr/bin/perl

$dir = $ARGV[0];

# Проверяваме валидна ли е директорията
unless (-d $dir) {
    print "'$dir' is not a valid directory, using the current directory!\n";
    $dir = '.';
}
# Сменяме текущата директория
chdir $dir || die "Error while chdir to $dir: $!\n";

opendir (DIR, $dir) || die ("Error opening dir: $!\n");

# Взимаме списък с файловете и го сортираме
@files = sort readdir(DIR);

print join "\n", @files;

close (DIR);

'' is not a valid directory, using the current directory!
.
..
example.0.pl
example.1.pl
example.2.pl
example.3.pl
example.4.pl
example.5.pl
example.6.pl

 

Пример 7

Примерът показва употребата на функциите telldir, readdir, stat и localtime. Функцията stat приложена над файлов хендлър или име връща масив от детайли относно файла. Тук се позлва за намиране големината на файла и датата, в която е бил променян за последно. Функцията localtime връща форматиран стринг с времето на машината, а получава като параметър секундите изминали от началото на epoch (00:00:00, January 1, 1904 за MacOS и 00:00:00 UTC, January 1, 1970 за повечето други OS).

 

source code ( example.7.pl ) output
#!/usr/bin/perl

$dir = $ARGV[0];

# Проверяваме валидна ли е директорията
unless (-d $dir) {
    print "'$dir' is not a valid directory, using the current directory!\n";
    $dir = '.';
}

# Сменяме текущата директория
chdir $dir || die "Error while chdir to $dir: $!\n";

opendir (DIR, $dir) || die ("Error opening dir: $!\n");

$dir_pos = telldir (DIR);
$file = readdir (DIR);
do {
    print "$dir_pos\t$file\t " . (stat($file))[7] . "\t" . localtime((stat($file))[9]) . "\n";
    $dir_pos = telldir(DIR);
} while ($file = readdir(DIR));
print join "\n", @files;

close (DIR);

'' is not a valid directory, using the current directory!
0 . 0 Thu Mar 20 17:31:44 2003
2 .. 0 Thu Mar 20 17:23:54 2003
5 example.0.pl 656 Thu Mar 20 12:19:04 2003
18 example.1.pl 215 Thu Mar 20 12:37:06 2003
31 example.2.pl 499 Thu Mar 20 15:47:39 2003
44 example.3.pl 540 Thu Mar 20 15:23:23 2003
57 example.4.pl 223 Thu Mar 20 15:28:27 2003
70 example.5.pl 534 Thu Mar 20 15:48:44 2003
83 example.6.pl 454 Thu Mar 20 17:05:05 2003
96 example.7.pl 589 Thu Mar 20 17:31:30 2003

 

Пример 8

Примерът демонстрира работа с файлове с произволен достъп. Както се вижда, няма нужда от по-различно отваряне на файла. Използват се функциите seek и tell за устаноявване на файловия указател и print, read и getc за вход/изход.

 

source code ( example.8.pl ) output
#!/usr/bin/perl

open (FILE, ">new.file") || die ("Error opening file new.file: $!\n");
print FILE '0123456789';
close (FILE);

open (FILE, "+<new.file") || die ("Error opening file new.file: $!\n");

seek FILE, 5, 0;

print "read: ". getc(FILE) . "\n";
print "pos: " . tell(FILE) . "\n";

seek (FILE, -2, 1);
print "pos: " . tell(FILE) . "\n";
read (FILE, $bla, 3);

print "read: $bla\n";

truncate (FILE, 8) || die "Error truncating file: $!\n";
print "pos: " . tell(FILE) . "\n";

print "read: ". getc(FILE) . "\n";
print FILE "abc";
close(FILE);

read: 5
pos: 6
pos: 4
read: 456
pos: 10
read:


Пример 9

Примерът демонстрира работа с файлове с произволен достъп. Тук се изпозлват функциите sysseek, syssread, syswrite, sysopen. Имайте в предвид, че те "прескачат" io, така че употребата им в комбинация с горните може да доведе до объркване и въобще не се препоръчва!

 

source code ( example.9.pl ) output
#!/usr/bin/perl

open (FILE, ">neu.file") || die ("Error opening file neu.file: $!\n");
print FILE '0123456789';
close (FILE);

sysopen (FILE, "neu.file", '<') || die ("Error opening file neu.file: $!\n");
print (($string = "Read: ") . "\n");

sysread FILE,$string,10,6;
print $string;

close(FILE);

sysopen (FILE, "neu.file", '>') || die ("Error opening file neu.file: $!\n");

$other_scalar = '0123abcdefghij';
syswrite (FILE, $other_scalar, 10, 4);

close(FILE);

Read:
Read: 0123456789

 

Пример 10

Примерът показва изпозването на функцията glob, както и на съкратения и запис <*.c>, които връщат списък от имената на файловете отговарящи на файловата маска. Препоръчва се употребата на функцията, отколкото на съкратения запис, особено ако имате нужда да интерполирате маската от някави променливи. Обърнете внимание, че се връща пълния път, както е зададен като параметър, а не само имената на файловете.

 

source code ( example.10.pl ) output
#!/usr/bin/perl

print "Current dir status:\n";
$dir = '.';

@files = glob("$dir/*");
print join "\n", @files;

unlink <*.file>;

<STDIN>;

print "Current dir status:\n";
@files = glob("$dir/*");
print join "\n", @files;

Current dir status:
./example.0.pl
./example.1.pl
./example.10.pl
./example.2.pl
./example.3.pl
./example.4.pl
./example.5.pl
./example.6.pl
./example.7.pl
./example.8.pl
./example.9.pl
./neu.file
./new.file
./pack4.tar.gz
Current dir status:
./example.0.pl
./example.1.pl
./example.10.pl
./example.2.pl
./example.3.pl
./example.4.pl
./example.5.pl
./example.6.pl
./example.7.pl
./example.8.pl
./example.9.pl
./pack4.tar.gz

 

 

Всичко това горе попада под ударите на Creative Commons License.
Задвижвано от
Movable Type 2.65

Най-добре се вижда с Firefox в 1024х768 или повече.