ドラフト: 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 の上に、扱え、そしてもし対応するグローバルがあるなら、関数、それはただメソッドの輸出されたバージョンに過ぎない。
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
ロールと 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.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 に特定された振る舞いのために我々は p:unix を持っている{}リテラル. ここで唯一の限界はロケールとファイルシステム型によって定義されることだ。 それで、もし現場が Latin1 にセットされるなら、我々は完全な Unicode を書くことが可能じゃないだろう。
私の Path $path = p:unix{/usr/src/bla/myfile?:%.file};
もし上の(人たち・もの)が problems, p:bin を起こしているなら{}、調べることはここでされない(とき・から・につれて・ように)、使われることができる. しかしながら、これは Path.Encoding 属性を未定義のままにしておく、そしてそれはパスのある特定の特徴が、この属性設定されているじゃないなら、利用できないままでいるであろうことを意味する。
VM、 DOS と古風な Mac のような、制約の他のセットがモジュールによって提供されるであろうことは期待される。
世界的な 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 、 returns $username に変換したか。
いつが Num 、 returns $uid に変換したか。
role OS::Unix::User does User {
has $password;
has $gid;
has $gecos;
has $shell;
}
すべての情報は getpwuid 、 getpwnam 、あるいは同類としてのシステムから当然取って来られる。
role Group {
has $name;
has $id;
has @members;
}
method Group new(:$Name, :$ID);
method write();
システムグループデータベースにグループ加入を書き込もうとする。
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 - 言語にエラーとフィードバックをポストしてくれ。 もしあなたが一般的なリストを作っているなら、どうかトピックによるメッセージを分離してくれ。