| ���������� | ����������� | �������� | ������
| ����� 1 | ����� 2 | ����� 3 | ����� 4 | ����� 5 | ����� 6 | ����� 7 | ����� 8 | ����� 9 | ����� 10
| ����� 11 | ����� 12 | ����� 13 | ����� 14 | ����� 15 | ����� 16 | ����� 17 | ����� 18 | ����� 19
| ���������� � | ���������� � | ���������� � | ���������� � |

����� 17

    � ���� �����:


������ � ����������������� ������ ������

DBM-���� ������ � DBM-����

� ����������� UNIX-������ ���� ����������� ����������, ������� ���������� DBM. ��� ���������� ������������ ����� ������� ������� ���������� ������ ������, ������� ��������� ���������� ���������� ����� ��� ����-�������� � ���� ������. � ���� ������ �������� �������� ���� ������ � ����������� ����� �������� ��������, ������������ ��, � ��� ��������� ����� ������� � ���� ������ ����� ��������, ��������� ����-�������� � ������� ������.

���������� DBM �������� ������, ��, �������� �� �����������, ����-����� ��������� ��������� ������� ���������� ��� ���������� ��� ����� �������� �������� ����. ��������, sendmail (� ����� �� �������� � �����������) ������ ���� ������ aliases (������������ ������� ����������� ����� � ���� �����������) ��� DBM-���� ������. ����� ��������ź �� ��������������� Usenet ���������� DBM-���� ������ ��� �������� �����-����� � ������� � ������� ������������� �������. ������� ����� ���� ������ Sun NTS (���������� YP) ����� �������� � ������� DBM.

Per! ������������ ������ � ������ �� ��������� DBM �������� ����� ��������: ����������� ��������, �������� �� �������� �����, � DBM-����� ������ ����� ������� ���. ���� ��� (���������� DBM-��������) ������-������ ��� ������� � DBM-���� ������ � �������� � ��� ���������.

�������� ������ �������� � ���� ������� ������ �� ����� ����������� ��������� � ���� ������. �������� �������� �������� � �������� �������� �� DBM-���� ������ � �.�.*

������, ���������� � ��� ������ � �������� � DBM-���� ������ ����������. � ����������� �� ����, ����� ������� ���������� DBM �� �����������, ��� �� ����������� ����� ����� ����� � ��� DBM-�������. ����������� ��. �� man-�������� AnyDBM_File. � �����, ���� �� ������� ������� ���, ����� � �����, � �������� ������������� �� ������ ��� � 1000 �������� � ������������� ��������� ����������, �� ��� ����� ���������.

�������� � �������� DBM-�����

����� ������� DBM-���� ������ � DBM-��������, ����������� ����-��� dbmopen, ������� ������������ ��������� �������:

dbmopen(%��� �������, "���_���-��{��", $�����}

�������� %���_������� � ��� ��� Perl-����. (���� � ������ ���� ��� ���� ��������, ��� �������������.) ��� ����������� � DBM-����� ������, �������� ���������� ���_���-�����. ��� ������ �������� �� ����� � ���� ���� ������ � ������� ���_���-�����.ӳ����_���-�����.���.

�������� $����� � ��� �����, ������� ������������� ����� ���� ������� � ��������� ���� ������, ���� ����� ��������� ������. ������ ��� ����������� � ������������ �������; ����� ������������ �������� 0644 ������������� ����� ������� ������ ��� ������ ����, ����� ���������, ������� ����� ����� �� ������ � ������. ���� ��� ����� ����������, ������ �������� �� ���������. ��������:

dbmopen(%FRED, "mydatabase", 0644); # �������� %FRED �� mydatabase

���� ����� ��������� ��� %fred � ������� mydatabase. dir � �� database.pag, �������������� � ������� ��������. ���� ��� ����� �� ����������, ��� ��������� � ������� ������� 0644, ������� �������������� � ������ �������� ��������, �������������� �������� umask.

������� dbmopen ���������� �������� "������", ���� ���� ������ ����� ������� ��� �������; � ��������� ������ ������������ "����" � ����� ��� ��, ��� ��� ������ ������� open. ���� �� �� ������ ��������� �����, ����������� ������ ��������� $����� �������� undef. ��������:

dbmopen(%A,"/etc/xx",undef) || die "cannot open DBM /etc/xx";

* ���, �� ���� ����, ������ ������ ������ ������������� ������ ��������� tie. ���� ��� ����������� ���-������ ����� ������, ���������� � man-��������� AnyDBM_File(3), DB_File(3) � perltie(l).

 

����, ��� � ������ ������, (^awibi/etc/xx.dirvi/etc/xx.pagoTKpbnb ������, �� ����� dbmopen ���������� �������� "����" ��� ������� ������� ��� �����.

DBM-������ �������� �������� � ������� ���������� ���� ���������. ����� ��������� �����������, ����������� � ����� � DBM-����� ������. ��� ����� ����� ��������� � ��������, ������� � �������� ����������� ����� � � ������� ������� dbmclose:

dbmclose(%A);

��� � ������� close, dbmclose ���������� �������� "����", ���� ���-������ ���������� �� ���, ��� ����.

������������� DBM-����

����� �������� ���� ������ ��������� � DBM-���� ������������� � ��������� � ���� ������. ��������� �������� � ���� ��� ���� � ���� ������ �������� �������� ����������� ������ ��������������� ��������� � ����� �� �����. ��������, ����� �������� ������� %fred �� ����������� ������� �� ����� ���������� � ��������� ���� ������, ������� � ��� ����� �������� � ������� ������������:

$FRED{"fred"} = "bedrock"; # ������� (��� ��������) ������� delete $FRED("barney"}; # ������� ������� ���� ������ foreach $key (keys %FRED) ( # ������ �� ���� ��������� print "$key has value of $FRED{$key)\n";

}

��������� ���� ������ ����������� ���� ���� �� ����� ������: ���� ��� ��� ������� ������, � ������ � ��� ������ ��������, ��������������� ���� ������. ���� �� �������������� DBM-���, �� ����� ����������� �������� � ����� ������ ������������ ����� �������� ������������� ���-����� each, ������� ������ ����� ���� ������:

while (($key, $value) = each(%FRED) ) ( print "$key has value of $value\n";

}

���� �� ����������� � ��������� DBM-����� ������, �������� � ����� ������, ��������� ��������� sendmail � NIS, �� ������ ����� � ����, ��� � ����� ���������� �-���������� � ����� ����� ������ ����� ������ NUL (\0). ���������� ���������� DBM ���� NUL �� ����� (��� ������������ �������� ������ � ������� �������� ������, � �� ������ � �������� NUL �� �����), ������� �� �������� ��� ����� ������. � ����� ������ �� ������ ��������� ������ NUL � ����� ����� ������ � ����������� NUL, ������� � ����� ������������ ��������, ����� ������ �� ����� ����� ������.

��������, ����� ����� ��� merlyn � ���� ������ �����������, ����� ������� ���:

dbmopen(%ALI, "/etc/aliases", undef) I I die "no aliases?";

$value �= $ALI {"merlyn\0" 1; # �������� �������� �� ����������� NUL

chop ($value) ; # ������� ����������� NUL

print "Randal's mail is headed for: $value\n"; # �������� ���������

� ����� ������ UNIX ���� ������ ����������� ����� ��������� �� � �������� /etc, � � �������� /usr/lib. ����� ��������, ��� ������ ��� ��������, �������� �������� ��������� �������������. ����� ������ sendmail ���� NUL-�������� �� ��������. ''

���� ������ ������������� ������� � �������� ������������� �����

��� ���� ����� �������� ������ � ���� �� �����, ��������������� ��� ������� ������������� �����. � ���� ����� ������ ������� �� ���� ������� ���������� �����. ��������� ���� ������� ���� �� ����� ��������, ���� ������������ �� �����-������ ����� ����������.

��������, � ��� ����� ���� ��� ������� �� ���������� �������:

40 �������� � ���, ���� ������ � �������, 40 �������� � ������� � ������������ ����� � �������. ����� �������, ����� ������ ������ ������-���� 83 �����. ���� �� �� ������ ��� ��� ������ � ���� ������, �� ������ �� ��� �������� �� 83 ����� �� ��� ���, ���� �� ��������� �� �����. ���� �� �� ������ ������� � ����� ������, �� �� ���������� �� ������ ���� �� 83 ����� (332 �����) � ��������� �� ��������������� ����� ������.

Perl ������������ ���������, ������� ���������� ���� � ��������� ��������. ������ ����, ��� �� ��� ������, ����������� ��� ��������� ��������:

1. �������� ����� �� ����� ��� ������ � ������.

2. ������� � ���� ����� �� ������������ �������.

3. ������� ������ ������������� �����, � �� �� ���������� ������� ����� ������.

4. ������ ������ ������� ������������� �����.

� ������� open ����� �������������, �������� ������ �������� ����� (��� ������ ��� ������), ���������� �������� ���� ����, ������ ����� �������, ��� ������ ���� � ���������������� ����������� � ��� ������, � ��� ������. ��������:

open (�, "+<�"); # �������� ���� b ��� ������-������ (������, ���� ���� �����������)

open(C, "+>d"); # ������� ���� d � �������� ��� ������-������

open(�, "+�f"); # ������� ��� ������� ���� f � �������� ��� ������-������

 

�������, ��� ���, ��� �� ������� � ��� �������� ���� ���� � �������-�����, �������� ����������� �����-������ ������ � ����.

������ ����, �� ������ ������� �� ������������ ������� � ���. ��� �������� � ������� ������� seek, ������� ��������� �� �� ��� ���������, ��� � ������������ ������� ��./yeeA^.?/ ������ �������� � ��� ���������� �����, � ������ �������� ������ ��������, ������� ���������������� � ������������ � ������� ����������. ��� �������, � �������� �������� ��������� �������� ����, ����� ������ �������� ������� ���������� ������� ��� ���������� ������ �� ����� ��� ������ � ����. ��������, ����� ������� � ����� ������ � ����������� ����� names (��� ������� ����), ����� ������� ���:

seek(NAMES,4*83,0) ;

����� ����������� ��������� � ����� �� ������ ������� ��������� �������� ����� ��� ������ ����� ���������� � ���� �������. ��� ������ ����������� ������� print, �� �� ��������, ��� ������������ ������ ������ ����� ������ ������������ �����. ����� ������������ ������ ���������� �����, ����� ��������������� �������� pack::

print NAMES pack("A40 A A40 s", $first, $middle, $last, $age);

� ������ ������ pack ������ 40 �������� ��� $ first, ���� ������ � ��� $middle, ��� 40 �������� � ��� $last � ������ź ����� (��� �����) ��� $���. ������������ ����� ������� ������ ����� ����� � ����� 83 ����� � ���������� � ������� ������� � �����.

�������, ��� ����� ������, ��� ������� ���������� ������. ��������-��� <names> ���������� ��� ������, ������� � ������� ������� � �� ���������� ������� ����� ������, ������ � ����� ������ ��������������, ��� ������ �������� 83 ����� �, ��������, ������ ����� ������ ��������-������� � ������ �����������. ������� ������ ��� �� ���������� ������� read, ������� �� �������� ���� � �������� ������ ����� ������ �� ���� UNIX-�������:

$count = read(NAMES, $buf, 83);

������ �������� ������� read � ���������� �����. ������ �������� � ��� ��������� ����������, � ������� ����� �������� ����������� ������. ������ �������� ������ ���������� ������, ������� ����� ���������. ���������� ������� read ���������� ���������� ����������� ������; ��� �������, ��� ����� �������������� ���������� ������, ���� ������ ���������� ����� ������ � ���� �� �� ���������� ������� ������ � ����� �����.

������� ��� 83-���������� ������, �������� �� �� ���������� � ������� ������� unpack:

($first, $middle, $last, $age) = unpack("A40 A A40 s", $buf);

 

��� �����, ������, ������������ ������, � �������� pack � unpack � ���������. � ����������� �������� ��� ������ ������� � ����������, �����-������ � ������ ���������, � ���� ��������� � ������� ������� pack ����� �������, � �� ���������� ����� ��������� 83:

$names = "�40 � �40 s";

$names_length = length(pack($names)); # ��������, 83

���� ������ � �������� ���������� ����� (���������)

������ ��������� ���� ������ �� UNIX (� �������� ������� ����� ���������������� ��� ������) ������������ ����� ������ �������� ����-���� ��������� �����, ������ �� ������� �������� ���� ������. ��������, ������ ������ ����� ������� ������������� ������ ������������ �������, � ������ ����� ������ � ������ ����-�����.

�������������� ��� ���� ������ � �������� � ������� ������� ��������� ����������. ��������� ���������� ���� ������ ������� �� ������ �� � �����-�� ��������� ������� (������ ��� ������ �������� ����), �������� ����������� ��������� � ���� ������ ���������� ������� � �������� ����, ���� �������� ������ ����� � ��� �� ������, � �������-������ ��������� ��� ��������������� ������ ������. ���� ������� ����� ������������� ��� ������������� �����������: ������ ���������� �� �������� ���� ������ � ����� �� ������ � ��������� ��������� � �������� �����������.

Perl ������������ �������������� ������ ���� � �������-������������-��� ����� ������ ������� �������������� �� �����. �������������� �� ����� � ��� ����������� �������, ����������� �������� �������� "����" (<>) ��������� ������ �� ������ ������, ���������� � ��������� ������. ���� ����� ���� ����� �������������� ���������� ����� ��������� ����-����� ��������� ������ -�, �� ��� ����� ��������� � ����� �� ���������, ��� �������� � ����������� ���� ��������.

����� ��������� ����� �������������� �� �����, ��������� �������� ��������� ���������� $ �. ��� ������ ������ ���� � ����� ������ �������-����.

����� ������������ ����������� � � ���������� $I ����� ��������, �������� �� undef, � ������ ������� ��������, ������� ��������� �������� "����", ����������� ����, ���������� � ����������� ���� ���� ������������ ## inplace ##:

$ARGV = shift 6ARGV;

open(ARGV,"<$ARGV") ;

rename($ARGV,"$ARGV$AI"); ## INPLACE ## unlink($ARGV); ## INPLACE ##

open(ARGVOUT,">$ARGV"); ## INPLACE ## select(ARGVOUT) ,- ## INPLACE ##

� ���������� � �������� "����" ��� ������ ������������ ������ ����, � ������ � ���������� ����� �� ��������� �������������� � ����� ����� ����� �����. ������ ���� �������� � ��������� �����, ������� ����� ����� ������� ����� �������� ���������� $AI. (��� ���� ���� ���� ������� ���������� �� ������� ����� � �����.) ��� ���� ����������� ������ ���, ����� ����� ���� ������� �� ������� @argv.

�������� �������� ���������� $I � .bak ��� ~, �.�. ��������� ����� ��������� ����� ��� ��, ��� ��� �������� � ��������� ���������. �������� � �������� �������� $I � ������ ������ (""), ��������� ������� ������ ���� ����� �������������� ��������� ���������. � ���������, ���� ������� ��� ���������� ����� ��������� �������, �� �� ��������� ��� ���� ������ ������, ������� �������� "" ������������� ������������ ������ ���������, ������� � ������� ����������.

��� ��� ����� ����� �������������� ����� ������� �������� ��������-������� shell ���� ������������� �� /bin/sh'.

8ARGV = ("/etc/passwd"); # �������� ����������� �������� "����"

$"1 == ".bak"; # ��� ���������� �������� /etc/passwd.bak

while (�) { # �������� ����, �� ���� ��� ������ ������ �����

# /etc/passwd s#: (: ] *$#:/bin/sh#; # �������� shell �� /bin/sh print; # ������� �������� ���������� � ARGVOUT: �����

# /etc/passwd

��� ������, ��� ��������� �������� ������. ������ �� ����� �������� ����� ���� ����� �������� � ����������� ����������� ��������� ������, ��������:

perl -� -�.bak -� 's#: [:]*$#:/bin/sh#' /etc/passwd

���� -� ���������� ���� ��������� ������ while, ������� �������� �������� print. ���� -� ������������� �������� ���������� $^1. ���� -� ���������� ��������� �������� ��� �������� Perl-���� ��� ���� �����, � ��������� �������� ������ �������ź �������� ������� @argv.

����� �������� ��������� ��������� ������ ��������������� � ����� Programming Perl � �� man-�������� perlrun.

����������

������ ��. � ���������� �.

1. �������� ���������, ������� ��������� ���� ������ ����������� send-mail � ������� �� ����� ��� �� ��������.

2. �������� ��� ���������: ���� ��� ������ ������ � ������� ���-����� �, �������� �� �� ����� � ���������� DBM-����� � ��������-���� ����� ����������� ������� �����, � ������ ��� �������� ����� DBM-����� � ����������� �����������, ���������������� �� ��������-�� ����������� ������� ����� � ��������� �������. ��������� ������ ��������� �� ��������� � ���������� ������ � ����������, �������-����� �� ������ ��������� ���������� ����������.




|     �����     |     ������     |


| ���������� | ����������� | �������� | ������
| ����� 1 | ����� 2 | ����� 3 | ����� 4 | ����� 5 | ����� 6 | ����� 7 | ����� 8 | ����� 9 | ����� 10
| ����� 11 | ����� 12 | ����� 13 | ����� 14 | ����� 15 | ����� 16 | ����� 17 | ����� 18 | ����� 19
| ���������� � | ���������� � | ���������� � | ���������� � |