タイトル

ドラフト: Synopsis 16: IO / ネームサービス

著者

Largely, the authors of the related Perl 5 docs.
Larry Wall <larry@wall.org>
Mark Stosberg <mark@summersault.com>
Tim Nelson <wayland@wayland.id.au>
Daniel Ruoso <daniel@ruoso.com>
 

機種

Created: 12 Sep 2006

Last Modified: 19 Nov 2009
Version: 23
 

これはドラフトドキュメントだ。 我々がロールの中にすべてを正当化しようとしていることを除いて、これらの関数の多くが Perl 5 のように働くだろう。 今のところあなたは重要な関数の大部分が自動的に * ネームスペースにあるであろうと想定することができる。 どんなに、 IO 演算で特に、それらの多くが本当はメソッドであるとしても、 IO の上に、扱え、そしてもし対応するグローバルがあるなら、関数、それはただメソッドの輸出されたバージョンに過ぎない。

IO

IO が扱う Overridable

Perl 6 に、同じシンボルのために内部のファイルハンドルをオーバーライドすることについて、さらに感覚がない IO が扱う水準と何でもある。

標準ハンドルは(新しい名前:で)我々の年がいった親しみがある友人たちだ。 インプットが標準入力から変わった水準$*INアウトプットが標準出力から変わった水準$*OUTそしてエラーが標準エラー出力から変わった水準$*ERR.  Perl 6 に、意味が文脈上決定されるから、これらのシンボルはコンセプトについて所定のファイルハンドルよりいっそう多くを表す。 ハンドルが生きるプロセスのこれらのバージョンPROCESS:: per-interpreter よりいっそうグローバルなネームスペースGLOBAL:: ネームスペース。

明示的なファイルハンドルが使われない、標準的な IO 演算子が定義されるときダイナミックな変数に関して。 そうprint そうするための関数プリント$*OUT、他方warn 警告するそうすること$*ERR.lines() 項インプットから$*ARGFILES 義務を怠るそうすること$*IN 何でもないときにはファイル名。 ダイナミックスコープ(インタプリター、スレッド、関数あるいはメソッド呼び出し)を与えられた何でもそれ自身のダイナミックスコープの中でそれらのファイルハンドルの何の現在の意味でも再定義するかもしれないようにそしてのそルーチンを呼び出す.

それで別の言い方をすれば、あなたが何かを書くとき、好む

say "Howdy, world!"
 

say 関数が現在の意味を探すの$*OUTそして撮影それがその呼び出し人に見いだすことができる最も近い定義. もし呼び出し人のいずれが定義をオーバーライドしなかったなら、それは通訳ので見るGLOBAL ネームスペース。 もし通訳がそうしなかったなら、オーバーライドされて、意味は、それは意味をとるPROCESS.  本質的に、 Perl 6 のダイナミックスコープが許可である何でも Unix シェルとほとんど同じようなリダイレクションが異なった構文でではあるが、そのサブプロセスで、する IO をする:

{
    temp $*OUT = open $newfile, :w;
    foo() # all stdout goes to $newfile
}
# stdout reverts to outer scope's definition
 

ロールと Classes

ロールと IO のために機能性の大部分を定義するクラスは S32-setting-library/IO.pod に定義される。 使われた関数がそうである本管が S32-setting-library/IO.pod に参照で S29 でリストされる。

特別な引用構文

ファイル名の使用は特別な引用構文を必要とする。 それは次のように機能する:

qp{/path/to/file}
q:p{/path/to/file}
 

上の(人たち・もの)の両方ともが同じことをもたらす。

/ がファイル名のためにおそらく悪いチョイスであるけれども、クォート文字はいつものものの何もであり得る。

上に示された規約はパスオブジェクト(あるいはその子孫)を返す。

当然あなたはファイル名で同じく補間を求めることができる:

qp:qq{$directory/$file}
qq:p{$directory/$file}
 

演算子を引用しているファイルに適用されることができる多くの特別な副詞がある。 これらの大部分がファイルシステムに特定されている。 それらがファイル名に含まれ得るものを限定する。

「/」で始まる Any パスが絶対パスだと見なされる、さもなければ道は親類だと見なされる。

qp で道を作るとき、{}、 $ への Path.Encoding 属性設定されている ? Enc 、なら:大箱修飾子(下を見ろ)使われる.

デフォルト制約

デフォルト制約は例えば「使用パス」プラグマで設定されることができる:

use path :posix;
use path :modern;
use path :local;
 

厳しいモードに「パスを使え: posix」があるのに対して、厳しくないモードでのデフォルトが「使用パス:地方」であるデフォルト。

: posix 制約

:パスが移植性がある POSIX パスである(POSIX.1-2008 セクション4.7そして3.276を見る)という制約の近代的なセット. もしプラットホーム / ファイルシステムに特定された振る舞いが必要とされるなら、特定の制約が必要に応じて応用されるべきだ(下参照)。

デフォルト制約はただセパレータそしてただ許可だけとして「/」にポータブル POSIX ファイル名を許すことだけをするはずだ。 それは A - Z 、 - z、 0-9 、 <期間>、 <アンダースコア>と <ハイフン>を意味する。 さらに、ハイフンは道で最初の文字じゃないかもしれない。

「/」で始まる Any パスが絶対パスだと見なされる、さもなければ道は親類だと見なされる。

:ポータブルだ

上の POSIX 制約のほかに、パスは、終止符、そして次にもう3つの文字によって後に続かれて、8つの文字に適切であるべきだ。 ただ1つの終止符だけがファイル名で現われるべきだ。 さらに、道が64の文字より長くないかもしれない。

:ローカルだ

これは次のことだ: Windows プラットホームの上に、勝て: Unix プラットホームなどの上の unix 。 これが異なった束縛セットでプラットホームの間に特にポータブルじゃないことに注意を払え。

:近代的な制約

:制約の近代的なセットが「posix」として同じだが、それらがどんな UTF-8 文字でも含んでいるかもしれないこと以外、ただ人たちよりむしろリストする.

:勝利制約

我々は Windows スタイルパスを許す、それで変換することと、このプラットホームの上にコードを保守することは痛みじゃない。

私の Path $path = p:勝利{ C:\ Program Files \ MS Access\file.file} ;

これが特に通常qで使われたバックスラッシュ引用を除外することを注意する{}.

: unix 制約

Unix に特定された振る舞いのために我々は p:unix を持っている{}リテラル. ここで唯一の限界はロケールとファイルシステム型によって定義されることだ。 それで、もし現場が Latin1 にセットされるなら、我々は完全な Unicode を書くことが可能じゃないだろう。

私の Path $path = p:unix{/usr/src/bla/myfile?:%.file};

:大箱制約(まったく制約がない)

もし上の(人たち・もの)が problems, p:bin を起こしているなら{}、調べることはここでされない(とき・から・につれて・ように)、使われることができる. しかしながら、これは Path.Encoding 属性を未定義のままにしておく、そしてそれはパスのある特定の特徴が、この属性設定されているじゃないなら、利用できないままでいるであろうことを意味する。

他の制約

VM、 DOS と古風な Mac のような、制約の他のセットがモジュールによって提供されるであろうことは期待される。

$* CWD

世界的な variable $* CWD は、主に、ある特定の特別なプロパティと一緒のパスオブジェクトだ:

 * It must check whether the path exists before changing its value
 * It can only be assigned an absolute path; if you want to make relative 
   changes, use the Array interface
 

$* CWD は現在のスレッドに特殊で、同じじゃない%*ENV<PATH> あるいはネイティブの getcwd / chdir 道、それは通常、共にプロセス規模だ。

変数は少なくともこれらのケースで使われる:

 * When a Path object is created, if the string it is given is not an
   absolute path, then $*CWD is prepended to it.
 * When a subprocess is executed, it is executed with the current
   thread's $*CWD as its working directory.
 

ネームサービス

ユーザーロール

role User {
    has $username; # Username (some descendants(?) may want to implement a real $name)
    has $id;  # User ID
    has $dir; # Home directory for files
}
 
新しい
method User new($Username?, $UID?) {...}
 

ユーザ名によって同様情報をフェッチして、新規ユーザオブジェクトを作成するあるいはユーザー id 。

書け
method write() {...}
 

ユーザーデータベースに現行ユーザオブジェクトを書き込もうとする。 これは失敗するだろう。

Str

いつが Str 、 returns $username に変換したか。

Num

いつが Num 、 returns $uid に変換したか。

OS::Unix ::ユーザーロール

role OS::Unix::User does User {
    has $password;
    has $gid;
    has $gecos;
    has $shell;
}
 

すべての情報は getpwuid 、 getpwnam 、あるいは同類としてのシステムから当然取って来られる。

Group ロール

role Group {
    has $name;
    has $id;
    has @members;
}
 
新しい
method Group new(:$Name, :$ID);
 
書け
method write();
 

システムグループデータベースにグループ加入を書き込もうとする。

OS::Unix :: NameServices ロール

NameServices ロールはそれらの間の、オブジェクトのリストとしての1束のそれらの間に Name Services データベース全体を返すであろう関数を持っている。 リストは特にいい加減であるように意図される。

role NameServices {
    method List of User     users()     {...} # getpwent, setpwent, endpwent
    method List of Group    groups()    {...} # getgrent, setgrent, endgrent
    method List of Service  services()  {...} # getservent, setservent, endservent
    method List of Protocol protocols() {...} # getprotoent, setprotoent, endprotoent
    method List of Network  networks()  {...} # getnetent, setnetent, endnetent
    method List of Host     hosts()     {...} # gethostent, sethostent, endhostent
}
 

付加

どうか perl6 - 言語にエラーとフィードバックをポストしてくれ。 もしあなたが一般的なリストを作っているなら、どうかトピックによるメッセージを分離してくれ。