getpwuid UID
getgrgid GID
getservbyname NAME,PROTO
gethostbyaddr ADDR,ADDRTYPE
getnetbyaddr ADDR,ADDRTYPE
getprotobynumber NUMBER
getservbyport PORT,PROTO
sethostent STAYOPEN
setnetent STAYOPEN
setprotoent STAYOPEN
setservent STAYOPEN

These routines are the same as their counterparts in the system C library. In list context, the return values from the various get routines are as follows:

これらのルーチンは、システムの C ライブラリの同名の関数と同じです。 リストコンテキストでは、さまざまな get ルーチンからの返り値は、次のようになります:

 # 0        1          2           3         4
 ( $name,   $passwd,   $gid,       $members  ) = getgr*
 ( $name,   $aliases,  $addrtype,  $net      ) = getnet*
 ( $name,   $aliases,  $port,      $proto    ) = getserv*
 ( $name,   $aliases,  $proto                ) = getproto*
 ( $name,   $aliases,  $addrtype,  $length,  @addrs ) = gethost*
 ( $name,   $passwd,   $uid,       $gid,     $quota,
 $comment,  $gcos,     $dir,       $shell,   $expire ) = getpw*
 # 5        6          7           8         9

(If the entry doesn't exist you get an empty list.)


The exact meaning of the $gcos field varies but it usually contains the real name of the user (as opposed to the login name) and other information pertaining to the user. Beware, however, that in many system users are able to change this information and therefore it cannot be trusted and therefore the $gcos is tainted (see perlsec). The $passwd and $shell, user's encrypted password and login shell, are also tainted, for the same reason.

$gcos フィールドの正確な意味はさまざまですが、通常は(ログイン名ではなく) ユーザーの実際の名前とユーザーに付随する情報を含みます。 但し、多くのシステムではユーザーがこの情報を変更できるので、この情報は 信頼できず、従って $gcos は汚染されます(perlsec を参照してください)。 ユーザーの暗号化されたパスワードとログインシェルである $passwd と $shell も、同様の理由で汚染されます。

In scalar context, you get the name, unless the function was a lookup by name, in which case you get the other thing, whatever it is. (If the entry doesn't exist you get the undefined value.) For example:

スカラコンテキストでは、*nam、*byname といった NAME で検索するもの以外は、 name を返し、NAME で検索するものは、何か別のものを返します。 (エントリが存在しなければ、未定義値が返ります。) 例えば:

    $uid   = getpwnam($name);
    $name  = getpwuid($num);
    $name  = getpwent();
    $gid   = getgrnam($name);
    $name  = getgrgid($num);
    $name  = getgrent();

In getpw*() the fields $quota, $comment, and $expire are special in that they are unsupported on many systems. If the $quota is unsupported, it is an empty scalar. If it is supported, it usually encodes the disk quota. If the $comment field is unsupported, it is an empty scalar. If it is supported it usually encodes some administrative comment about the user. In some systems the $quota field may be $change or $age, fields that have to do with password aging. In some systems the $comment field may be $class. The $expire field, if present, encodes the expiration period of the account or the password. For the availability and the exact meaning of these fields in your system, please consult getpwnam(3) and your system's pwd.h file. You can also find out from within Perl what your $quota and $comment fields mean and whether you have the $expire field by using the Config module and the values d_pwquota, d_pwage, d_pwchange, d_pwcomment, and d_pwexpire. Shadow password files are supported only if your vendor has implemented them in the intuitive fashion that calling the regular C library routines gets the shadow versions if you're running under privilege or if there exists the shadow(3) functions as found in System V (this includes Solaris and Linux). Those systems that implement a proprietary shadow password facility are unlikely to be supported.

getpw*() では、$quota, $comment, $expire フィールドは、 多くのシステムでは対応していないので特別な処理がされます。 $quota が非対応の場合、空のスカラになります。 対応している場合、通常はディスククォータの値が入ります。 $comment フィールドが非対応の場合、空のスカラになります。 対応している場合、通常はユーザーに関する管理上のコメントが入ります。 $quota フィールドはパスワードの寿命を示す $change や $age である システムもあります。 $comment フィールドは $class であるシステムもあります。 $expire フィールドがある場合は、アカウントやパスワードが時間切れになる 期間が入ります。 動作させるシステムでのこれらのフィールドの有効性と正確な意味については、 getpwnam(3) のドキュメントと pwd.h ファイルを参照してください。 $quota と $comment フィールドが何を意味しているかと、$expire フィールドが あるかどうかは、Config モジュールを使って、d_pwquota, d_pwage, d_pwchange, d_pwcomment, d_pwexpire の値を調べることによって Perl 自身で調べることも出来ます。 シャドウパスワードは、通常の C ライブラリルーチンを権限がある状態で 呼び出すことでシャドウ版が取得できるか、System V にあるような (Solaris と Linux を含みます) shadow(3) 関数があるといった、 直感的な方法で実装されている場合にのみ対応されます。 独占的なシャドウパスワード機能を実装しているシステムでは、 それに対応されることはないでしょう。

The $members value returned by getgr*() is a space-separated list of the login names of the members of the group.

getgr*() によって返る値 $members は、グループのメンバの ログイン名をスペースで区切ったものです。

For the gethost*() functions, if the h_errno variable is supported in C, it will be returned to you via $? if the function call fails. The @addrs value returned by a successful call is a list of raw addresses returned by the corresponding library call. In the Internet domain, each address is four bytes long; you can unpack it by saying something like:

gethost*() 関数では、C で h_errno 変数がサポートされていれば、 関数呼出が失敗したときに、$? を通して、その値が返されます。 成功時に返される @addrs 値は、対応するシステムコールが返す、 生のアドレスのリストです。 インターネットドメインでは、個々のアドレスは、4 バイト長です; 以下のようにして unpack することができます:

    ($a,$b,$c,$d) = unpack('W4',$addr[0]);

The Socket library makes this slightly easier:

Socket ライブラリを使うともう少し簡単になります。

    use Socket;
    $iaddr = inet_aton("127.1"); # or whatever address
    $name  = gethostbyaddr($iaddr, AF_INET);

    # or going the other way
    $straddr = inet_ntoa($iaddr);

In the opposite way, to resolve a hostname to the IP address you can write this:

逆方向に、ホスト名から IP アドレスを解決するには以下のように書けます:

    use Socket;
    $packed_ip = gethostbyname("");
    if (defined $packed_ip) {
        $ip_address = inet_ntoa($packed_ip);

Make sure gethostbyname() is called in SCALAR context and that its return value is checked for definedness.

gethostbyname() はスカラコンテキストで呼び出すようにして、返り値が 定義されているかを必ずチェックしてください。

The getprotobynumber function, even though it only takes one argument, has the precedence of a list operator, so beware:

getprotobynumber 関数は、一つの引数しか取らないにも関わらず、リスト 演算子の優先順位を持ちます; 従って注意してください:

    getprotobynumber $number eq 'icmp'   # WRONG
    getprotobynumber($number eq 'icmp')  # actually means this
    getprotobynumber($number) eq 'icmp'  # better this way

If you get tired of remembering which element of the return list contains which return value, by-name interfaces are provided in standard modules: File::stat, Net::hostent, Net::netent, Net::protoent, Net::servent, Time::gmtime, Time::localtime, and User::grent. These override the normal built-ins, supplying versions that return objects with the appropriate names for each field. For example:

返り値のリストの何番目がどの要素かを覚えるのに疲れたなら、 名前ベースのインターフェースが標準モジュールで提供されています: File::stat, Net::hostent, Net::netent, Net::protoent, Net::servent, Time::gmtime, Time::localtime, User::grent です。 これらは通常の組み込みを上書きし、 それぞれのフィールドに適切な名前をつけたオブジェクトを返します。 例えば:

   use File::stat;
   use User::pwent;
   $is_his = (stat($filename)->uid == pwent($whoever)->uid);

Even though it looks as though they're the same method calls (uid), they aren't, because a File::stat object is different from a User::pwent object.

同じメソッド(uid)を呼び出しているように見えますが、違います; なぜなら File::stat オブジェクトは User::pwent オブジェクトとは 異なるからです。

移植性の問題: "getpwnam" in perlport から "endservent" in perlport