����� 16� ���� �����:
�������� � ���������� �������� ������ ��������� ���������� � ���� ���������� ������ � ��������� ����� ��������������� ���������� � ������� � ������� ���������� � ����� ���������������� ����� � ��������������, ����-��� ������� � ������� UNIX, ����������� �������. �� ���� ����, ����� ���������, ������� �� ������ �� ���� ��������� � ���� /etc/passwd, ������� ��� ������� ����� ���, ����� ���������������� ������. ���� ���� ����� ������ ������, ������������ � passwd(5), � �������� �������������� ���: name:pa3swd:uid:gid:gcos:dir:shell ���� ���������� ��������� �������: name ��������������� ��� ������������ passwd ������������� ������ ��� ���-������ �������, ���� ������������ ������� ���� ������� uid ������������� ������������ (��� ������������ root � 0, ��� ������� ������������� � ��������� �����) gid ��������������� ������ �� ��������� (������ 0 ����� ���� �������-����������, �� �� �����������) gcos ��� �������, �������� ������ ��� ������������, �� ������� ����� ������� ������� � ������ ���������� dir ��������� ������� (�������, � ������� �� ����������, ����� ����� ������� cd ��� ����������, � � ������� �������� ����������� ����� ������, ����� ������� ���������� � �����) shell ��� ��������������� shell, ��� �������, /bin/sh ��� /��/csh (�, ����� ����, ���� /usr/bin/perl, ���� �� ������� ��������) �������� �������� ����� ������� �������� ���: fred:*:123:15:Fred Flintstone,,,:/home/fred:/bin/csh barney:*:125:15:Barney Rubble,,,:/home/barney:/bin/csh ������ � Perl ���������� ������������ ��� ����, ����� ����� ���� ����� ��������� ������ ����� ������ (��������, � ������� ������� split), �� �������� � ����������� ����������. ��� �� ����� � ���������� UNIX ��� �� ���� ����� ����������� ��������: getpwent(3), getpwuid(3), gelpwnam(3) � �.�. ��� ��������� �������� � Perl ��� ���� �� �������, � �������� ����������� � ������������� ����������. ��������, ��������� getpwnam � Perl ���������� �������� getpwnam. �� ������������ �������� � ���������������� ��� (��������, fred ��� barney), � ������������ �������� � ������ ����� /etc/passwd, �������-�������� � ������ �� ���������� ����������: ($name, $passwd, $uid, $gid, $quota, $cominent, $gcos, $dir, $shell) �������� ��������: ����� ��������� ������ ��������, ��� � ����� �������. ������ � UNIX-��������, �� ������� ���� � ���, ������� �� ������, ���� $quota ������ �����, � ���� $comment � $gcos ����� ��� �������� ������������ ���������� � ������������ (���� GCOS). ���, ��� ������� ����� �� �������� ("fred", "*", 123, 15, "", "Fred Flintstone,,,", "Fred Flintstone,,,", "/home/gred"," /bin/csh") ����������� ������ �� ��������� �������: getpwuid(123) getpwnam("fred")
�������, ��� � �������� ��������� ������� getpwuid ��������� ����-��������� ������������, a getpwnam � ��������������� ���. ��� ������� � ��������� ��������� ������� getpwnam � getpwuid ����� ����� ������������ �������� � ������, ������� �� ��������� � �� �������. ��������: $idnum = getpwuid("daemon"); $login �= getpwnam (25); ��������, ��� ��������� �������� ��� ���������� �� �����������, ��-������� ��������� �� ��� �������� ��� ��������, ���������� ��� ��������. ���� ������ � �������� ����� ������, ��������� ��� ����� ���� ������, �������� �������� ��� ����� ������ ��������� �������: ($fred home) = (getpwnam ("fred"))[7]; # ��������� ������� ����� ��� ����������� ���� ���� �������? ��� ����� ����� ����� �� ���������, � �������, ���: for($id = 0; $id <= 10_000; $id++) f @stuff = getpwuid $id; } ### �� �������������! ���, ������, �������� ����. ������� ���������� �������� ���� �� ���� ��� �� ��������, ��� ��� ��� � ������ ������� ����������. ������� getpwuid � getpwnam ����� ������� ��������� ���������-���� �������; ��� ��������� ���������� ������� �� ��� �����, ������� ��� ������ � ��� ������ ���� ����. ������ ����� ������� � ����� ������� � ����������������, �.�. ����������� ��������� ��� �������. ����������� ����������������� ������� � ����� ������� �������� ������� setpwent, getpwent � endpwent. � ������������ ��� ��� ������� ��������� ���������������� ������ �� ���� ������� ����� �������. ������� setpwent �������������� ��������. ����� ������������� ���-��� ����� getpwent ���������� ��������� ������ ����� �������. ���� ������ ��� ��������� ������ ���, getpwent ���������� ������ ������. �������, ����� endpwent ����������� �������, ������������ ���������� ���������; ��� �������� ������������� � ��� ������ �� ���������. ����������� �������� ����� ��������� �� ������ �������� ��� �����-��, ������� ����� ���: setpwent (); # ���������������� �������� while (@list " getpwent ()) ( # ������� ��������� ������� ($login,$home) = @list[0,7]; # �������� ��������������� ��� # � ��������� ������� print "Home directory for $login is $home\n"; # �������� ��� } endpwent(); # ��� �������
��� ��������� �������� ����� ��������� ��������� ���� �������������, ������������� � ����� �������. � ���� �� ������ ���������� ��������� �������� � ���������� �������? � ���������� ����� �� ������� ������� sort, ������� ������������� ��: setpwentf); # ���������������� �������� while (@list = getpwentO) ( # ������� ��������� ������� ($login,$home) = @list[0,7]; # �������� ��������������� ��� # � ��������� ������� $home($login} = $home; # ��������� �� ) endpwent(); # ��� ������� Skeys = sort ( $home($a( cmp $home($b) } keys %home; foreach $login (Skeys) ( # ������ �� ����������������� ������ print "home of $login is $home($login)\n"; } ���� ��������� ����� ������� �������� ������������ ������ ������-����� ����������������� ��������� ����� �������: �� ������ ��������� ��������������� ��������� ������ � ���������� ������, ���������� �� ��Ϻ�� ����������. ������ ����� ������� � ��� ��� ��������� ����� ����� ������� � ��������� ����, � ������� ���� � ��������������� ���, � �������� � ��������� �������, ��������������� ����� ���������������� �����. ������ sort �������� ����� ���� � ��������� �� � ������������ �� ��������� ���������. ����������� ���� � ��� ������ �� �������������-��� ������ � ����������� ����� ���� ��������. � ����� ������ ��� ��������� ���������� ���������� �������� ����-��������� ������������ ��������� ������������� ������� (getpwuid � getpwnam). ���� �������� ����� ��� ��������� �������� ���� ��������, ����� ��������� ������ � ���������������� �������� (� ������� ����-��� setpwent, getpwent � endpwent) � ��������� ���������� ��������, ������� �� ������ ������, � ���*. ������ � ����� /etc/group �������������� ����������� �������. �����-����������� ������ �������������� �������� ������� setgrent, getgrent � endgrent. ����� getgrent ���������� �������� � ��������� �������: <$name, $passwd, $gid, $members) ��� ������ �������� �������� ������������� ������� ����� ����� /etc/group, ������� �� ��������� ����������� ����������� � ���������, ����������� �� man-���������, ����������� � ������� ����� �����. ��������������� ������� ������������� ������� � getgrgid (�� ����-���������� ������) � getgrnam (�� ����� ������). * ���� � ��� ���� � ������� NIS-������, �� �� ������������ ������������������ ����� ������ ������������� ����� ������� ����� �� ������������.
�������� � ���������� �������� ������ ������ � ������� � ������� ������ ������������ � ��������� ����. ���������� � ������ ��������� ����� ������ ����� ����������� ������������ �����. ��������, IP-����� ���������� �������������� ����������� ����������� ��� ��������������� �����. ���� ��� ����� ������������ � ��������� ���� (��� ������ ��������� ����� �����, ����������� �������), ����� �������������� � ������ ����� �������, ���� ��� ������ � ���������� ����� ���������������� �� ��������� �� ����� ������������. �� ���� ������� ���������� �� Perl ������� ���������, ��������� ��� ������������ IP-�����, ���������� ��������������� ������, ������ ������� ������� �������������� ���� ���� � ������. ���� ��������������� � ������������� ����� �������� ������ � �������� ������� ������, �����-��� � ������� ������� chr � ord (����� �� ��������������), � Perl ������������ ����� ����������� �������, ������� � ������ ������� ���-������ � � ����� ������� ����������. ������� pack �� �������� ������ ������� ������ �� ������� sprintf. ��� �������� ������, �������� ������, � ������ �������� � ����������� �������� � ���� ������. ������ � pack ������, �������� ������, ������������� ��� �������� �������� ��������� ������. �����-���, ��� ��� ����� ����� ������ ��������� ����� ����� � ��������� �� � ���� ������������������ ������ ��� ����� � ������: 5buf = packf'CCCC", 140, 186, 65, 25); ����� ������ ������� pack � ������ ����� �. ������ � ������������� ���������� ��������, ������� �� ������������ ������ ������ (������� ����, ��� ������ ������������ % � ������� sprintf). ������ � (�������� man-��������� Perl, �������� �����������, ����� Programming Perl, HTML-������ � ���� ����������� Perl: The Motion Picture) ���������� ���� ����, ����������� �� ����������� �������� ��� ����� (��������� ������). ������-��������� � ���������� $buf ������������ ����� ����������������� ������, � ������� ������ ������ ����� ����� ������. ��� ����� ����� �������� 140, 186, 65 � 25 ��������������. ����������� ������� ������ 1 ���������� ������� �������� �� ������. �� ������ ������� ��� ��������������� �����, ���� ���� ������ ������� �� ���������� ������. �� ��������������� "�������" ������ �������� $buf = packC'l",0�41424344) ; ���������� ����������������� ������, ��������� �� �������� abcd ��� dcba -- � ����������� �� ����, ����� ������� �������� ������ ������������ �� ������ ������: "������� � �������" ��� "������� � �������" (���� ���-�� ���������� ����, ���� ��� ������ "�� �������" �� ASCII). ��� �³�������� ���, ��� �� ����������� ���� �������� � ������ ������� (��� ������������� �������� ������ ��������� ������ �����), � ��� ���� �������� ��� ��� ������� �� ������, �������������� ���� ASCII ������ ������� ���� ��������. ����������� �������, $buf = pack("ll", 0�41424344, 0�45464748); ������� �������������� ������, ��������� �� ���� abcdefgh ��� dcbahgfe, �����-���� � ����������� �� ����, ����� ������� �������� ������ ������������ � ������ ������ � "������� � �������" ��� "������� � �������". ������ �������� ��������� ��������, ������������ ��� ��������, �������� � ���������� ������������ (perlfunc(l) ��� Programming Perl). �� �������� ��������� �� ��� ��� �������, �� ���, �������, ������ �� �����. ��������, ��� ���� �������������� ������ abcdefgh � �������, ��� ��� �������� �������������� ���������� � ������ (���� ������ � ���� ����) ���� ������� (���������������) �������� �� ������. ��� �� ������������-����? ����� ��������������� ��������, �������� ������� pack,� ����-���� unpack. ��� ����� ������ ���������� �������� (��� �������, ����-������ ���, ������� �� ��������� � ������� pack) � ������ ������ � ���������� ������ ��������, ������� �������� � ��������������� ������� ������. �������, ��������, ��������� ����� ������: ($vall,$val2) = unpack("ll","ABCDEFGH"); ��� ���� ��� � ���������� $vall ����� ����� 0�41424344, � ����� ����, � 0�44434241 (� ����������� �� ������� �������� ������). �� ���� ����, �� ������������ ��������� �� ����� ����������, �� ����� ������ �������� � � �������� "������� � �������" ��� "������� � �������". ���������� ������� � ������, �������� ������, ������������ � ��-���������� ���� ��� ���������������. ����� � ���� ������, ��� �������, ������ ���������� ���������� ������������ ��������������� ���������� ���. ��������, ���� ����� �������� ��� �4 ��� �2�2, ����� �� ����� �� ���������. (������ � ��������� ������������� �����, ��������� ����� �������, ��������� ������, �������� ������ ������������, ������� �� �������� ������� ���������� ������.) ����� ������� ������� ����� ������ ����� ���������, ������� ������ ��������� ���������� ������� ������� �� ��� ���, ���� �� ���������� ��������� ����� ������ �������� ��� ���� �� ������� ��������� ����� ������, ���������� �������� ������������� (� ����������� �� ����, ��� ����������� � �������� ��� ����������). ��� ��� ���� ������ �������� ������� �������� ��� ����� � ���� ������: $bu£ � pack("C*", 140, 186, 65, 25); ����� ��������� ������ �������� ��������� �������������� ����� ������������� �������. ���� �� ��� ����������� ��� �������� ����� � "����������� ��������� ���������� �������� ��� �����", �� ����� ���� �� �������� �������� ���: $buf = pack("s2 C*", 3141, 5926, 5, 3, 5, 8, 9, 7, 9, 3, 2);
����� �� �������� ������ ��� �������� ��� �������� (� ����������, ��������, ������ ��� ������ ��������), � ��������� ������ � ��� ������� ��� ����� (� ����������, ����� ���������, ������ ��������). ������� unpack co ���������� � �������� ������������ ����� �����-������ ������ ���������, ����� ������� ������� �� ����������. ��������, ��� ���������� � �������������� ������� �* ��������� ���� ������� ������ (�����) ��� ������� ������� ������. ���, �������� @values = unpack("�*", "hello, world!\n"); ��������� ������������ ������ �� 14 ���������, �� ������ ��� ������� ������� ������. ��������� ���������� � ���� Perl ������������ ������� ���������������� ����������, ������� ����-�� ������� ���, ��� ����� ��������� ��� ������� ���������� �� �. �� ���� ����, ����������� ������� Perl, �������������� ������ � ����, ����� � �� �� �����, ��� �� �-�������, � ������� ���������. � ���� ����� �� �� ����� �������� ������ ���������� �� �������� ����������������, ������� ������ ���������� �������� �������� ����������. ���� �� ����������, ������� ��� ���������� ����� ����������,� ��� IP-�����, ��������������� �������� ����� (��� ��������). � � �� �����-������� ������� ��� � ������� ����� � ������� ��������� gethostbyname(3). �����, ��������� ���������� �����, �� �������������� ����� ����� ����� ���������� � ������ ����������, ������� �������� ���-�� � ������ �����. � Perl �������, ������������� ����-��� � �����, ����� �� �� ���, ��� � �-���������, � ������� ���������. �������� ��� ���: ($name, $aliases, $addrtype, $length, @addrs) = gethostbyname($name); # �������� ����� ������� gethostbyname �������� ���� ������� � ��� �����, ��������, slate.bedrock.com, � ������������ �������� � ������ �� ������� � ����� ���������� (� ����-������� �� ����, ������� ������� ������� � ������ ������). ���� ��� ����� ���������������, ������� ���������� ������ ������. ����� gethostbyname ���������� � ��������� ���������, ������������ ������ ������ �����. ���� gethostbyname ����������� �������, �� ���������� $name � �������� �������� ������������� ������������ ���, �������, ���� ������� ��� � ���������, ���������� �� �������� �����. �������� ���������� $aliases � ��� ������ ����������� ��������� ����, ��� �������� ������ ���� �������� � ����. ���������� $addrtype �������� ������� ����������� ������� ������������� ������. ��� ����� slate. bedrock. corn �� ����� ������������, ��� ��� �������� ��������� �� IP-�����, ������ �������������� ��� ������ ����� �� ��������� �� 1 �� 256, ����������� �������. ���������� $length �������� ���������� �������. ��� ������ ����������, ��� ��� � ����� ������ ����� ���������� �� ������ ������� @addrs. �������� �������� ����� ������������� �������� � ������ @addrs. ������ ������� ������� ������� � ��� ��������� IP-�����, �����������-��� �� ���������� ������� � �������������� � Perl ��� ����������������� ������*. ��� ����������������� ������ ������������ � �����, �������� ��� ������ ������� Perl-�������. ������ �����������, ��� ��� ��������� ������� ��������� � ����, ������� ��� ������������. � ������ ������ ��� ����� � ������� ������� unpack � ��� ���������� �������� �������-������ ������������ �������� � ������������� ������. ��� ���, ������� ������������ ����� ������ �� ��-������� ����� slate.bedrock.com: ($addr) = (gethostbyname("slate.bedrock.com"))[4]; print "Slate's address is ", join(".",unpack ("C4", $addr)), "\n"; ������� unpack �������� ��������������� ������ � ���������� ������ �����. �����������, ��� ����� ������ � ��� �������, ������� ����� ������� join ��� ����, ����� ��� �������� ����� ������ ����� ����� ����� � ����������� ����� ������� ��� ��� � ������������� �����. ���������� � ������� ����������-�������� ��������� � ���������� �. ���������� 1. �������� ���������, ������� ������� ������� ������������ ��������-������� ������������� � �������� ���� �� ������� ����� �������, � ����� � ������� ���� ������� ������� ������ �������� ����, ������-������� ������ ������, ���������� � ����� �����. (�������� �� ��� ������ ��� �������������, � ������� � ������ ����� ������� ����� ������ �� ���������, �� � ������ ����� ����� ������ ���������� ���� ������ ���? ���� �� ��������, ��� ��� �������?) |