����� 17� ���� �����:
�������� � �������� DBM-����� ������������� DBM-���� ���� ������ ������������� ������� � �������� ������������� ����� ���� ������ � �������� ���������� ����� (���������) ���������� ������ � ����������������� ������ ������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-����� � ����������� �����������, ���������������� �� ��������-�� ����������� ������� ����� � ��������� �������. ��������� ������ ��������� �� ��������� � ���������� ������ � ����������, �������-����� �� ������ ��������� ���������� ����������. |