:()なんのヒントも存在しません。このリストは空の配列として宣言されているのでしょうか、それとも、カラのハッシュとしてでしょうか。perlインタープリタには、明らかにどちらとも判断することができません。リストの値はネストできません。"entries"(訳註:値))が内包された配列なのか、ハッシュなのかどうかがわかりません。上のコードはwarningが出ます。ハッシュが7つの要素のリストで宣言されているからです。@parts;詳細は後ほど。コンテキストPerlの最も特徴のあるところは、コードがコンテクストセンシティブなところです。Perlの全ての式はスカラコンテキストかリストコンテキストで評価されます。スカラかリストをのいずれかを作るかを期待されているかに依存します。多くのPerlの式と組込の関数は、それが評価されるコンテキストによって、振る舞いに根本的に違いを見せます。=のようなスカラの割り当てはスカラコンテキストとして評価されます。ような配列やハッシュの割り当ては、リストコンテキストで評価されます。リストの値はリストコンテキストで評価され、リストを返します。"Pie");驚くようなことはありません。"Pie"配列の式(配列はリストと違います。組込関数は全ての引数をリストコンテキストで評価します。printは無制限のリストの引数を受取り、一つ一つ出力します。配列を直接与えることが出来ます。"-X-AlphaBetaGoo98";どのような式もscalar組込関数を使えばスカラコンテキストで強制的に評価することが出来ます。このことが、なぜscalarを配列の長さを取るのに使うのかの理由です。サブルーチンがスカラコンテキストで評価されるときにスカラを返すような法律やシンタックスにはあなたは縛られていませんし、また、リストコンテキストでリストを返すこともまた同じです。上で見たように、Perlは完全にあなたのために結果を作ることができます。リファレンスとネストされたデータ構造リストが要素としてリストを含めないのと同様、配列とハッシュは他の配列やハッシュを要素として持てません。両方ともスカラしか持てません。"2"$outer[3]はスカラです。そのため、スカラの値を要求します。@innerのような配列を割り当てようとすると、@innerはスカラコンテキストで評価されます。@innerと同じです。配列@innerの長さ、2になります。スカラ変数は、配列変数やハッシュ変数を含む、他の変数へのリファレンスを持てます。これが、Perlでより複雑なデータ構造を作る方法です。リファレンスはバックスラッシュを使って作られます。\$colour;いつでも、変数の名前を使えます。代わりにブレースを置いて、ブレース内に変数へのリファレンスを置きます。commonデータ構造を宣言する4つの例があります。実践的には、最後のものがもっとも有用です。$ownersRef,);これは、明らかに不必要で骨の折れます。\@owners,);別の記号を使って無名配列やハッシュを宣言することも出来ます。四角いブラケットを無名配列に、ブレースを無名ハッシュに使います。それぞれ、返される値は、無名のデータ構造のリファレンスになります。注意して見てください。"2841-04-09",},],);データ構造から情報を取り出すさて、いじくりまわすために%accountがまだあるとしましょう。全ての他のもの(他のものがあったなら)は、スコープの外に落ちます。それぞれのケースで同じ手順を逆向きにすることで、情報を表示できます。一度、4つの例がありますが、最後のものが一番有用です。条件"のシンタックスがあります。hot";}unlessブロックは災いのように避けるのが一番です。それらは混乱のもととなります。ブロックに、条件を否定する[または、条件をそのままにブロックを交換する]ことでリファクタできます。elsunlessのキーワードはありません。ステートメントをひとつのステートメントに埋め込めます。両方のケースの単数と複数を完全に書き出されています。以下のような巧妙なことをしないでください。コードを検索して、"tooth"か"teeth"の単語を置き換えようとしても、この行から見つけることができません。eggs";if文では、これらの条件がはスカラコンテキストで価されます。if(@array)は、@arrayにひとつ以上のエレメントがある場合のみ、真となります。全てがundefや他の偽の値でもループやりかたはひとつではありません。@array);基本的なC-styleのforループも利用できます。myをfor文の内側に置く方法に注意してください。tidier.この種のforループは古臭いやり方なので、可能であれば避けるべきです。リストのネイティブのイテレーションはより簡単です。キーワードはシノニムです。$array[$i];}ハッシュはイテレートできません。そのキーをイテレートできます。組込関数のkeysを使って、ハッシュの全てのキーを含む配列を取り出してください。$scientists{$key};}ハッシュには順番がありませんので、keysはどのような順番でも戻ります。$scientists{$key};}明示的なイテレータを使わなければ、Perlはデフォルトのイテレータとして$_を使います。lastはループ進みを制御するのに使われます。breakとなっています。オプションで、どのループにもラベルをつけることができます。慣例により、ラベルは全て大文字で書くことになっています。ラベルを対象にできます。配列の最後の要素を引き出して返します。全て、spliceの特別なケースです。配列のスライスを削除して、返します。Selenium"リストコンテキストでは、reverse関数は逆順のリストを返します。スカラーコンテキストではreverseリストの全てをつなげて一つの文字列として、それを逆順にします。結果として新しい配列を作ります。BOISE"grep関数は入力として配列をとり、フィルターされた配列を出力します。シンタックスはmapと似ています。今度は、第二引数は入力された配列の各スカラ$_を評価されます。ブーリアンで真の値が戻れば、スカラは配列として出力されますが、そうでなければ、出力されません。Denver"当然、結果の配列の長さは、マッチに成功した数になります、このとことは、grepを配列に要素があるかどうかを素早くチェックするのに使えることを意味します。リスト包含の形に含まれます。他の多くのプログラミング言語に目立って欠けている、例外的に強力な機能です。mapと似て、自分のコードを渡すことも出来ます。ソートは常に2要素間の一連の比較を使ってされます。常にスカラーですが、比較が難しい非常に複雑なオブジェクトのリファレンスもありえます。$bと一緒には渡されません。組込関数はPerlの最も偉大な強みのひとつです。組込関数が存在していることを知ることに館する最も良いアドバイスは、それらが存在することを知ることです。未来のリファレンスにざっと目を通してください。低レベルで以前に何度も行っている十分に共通だと感じるタスクを実行しているなら、そのチャンスです。キーワードを使って宣言されます。そのリストは、もちろん、ひとつの要素か、空の場合もあります。ひとつのスカラは一つの要素のリストです。N要素のハッシュは2N要素のリストです。括弧はオプションですが、サブルーチンは、引数がひとつも無くても、常に括弧付きで使うべきです。しておけば、サブルーチンが呼ばれたことが、明確になります。サブルーチンの中に入ってしまうと、組込の配列変数@_が使えます。"e-x-t-e-r-m-i-n-a-t-e"Perlがリファレンスとよぶもの全ての他の主要なプログラミング言語とは違い、Perlはリファレンスと呼びます。これは、サブルーチンの内側で利用可能な変数か値がオリジナルのコピーではないことを意味します。42;これは明らかにナンセンスです。このレッスンで学ぶことは、サブルーチンの中で、それらで何かする前に、いつも引数をアンパックすべきです。引数を取り出す@_を取り出すのにいくつかやり方があります。いくつかは、他のものより、より良いです。例のサブルーチンleft_padは、以下の例は、渡された詰め込み文字を使って、必要な長さになるまで文字列に付加します。(x関数は行に同じ文字列の複数のコピーをつなげます)。簡潔さのために、これらのサブルーチンは全て基本的なエラーチェックを行っていません。詰め込み文字が1文字のみであることを保証するとか、長さが既存の文字列の長さ以上であるか、必要な引数が全て渡されているかどうか、など)。$newString;}shiftに配列を渡さなければ、暗黙に、@_に対して操作します。$newString;}引数が5つ以上になるなら、どこで割り当てたかを追い続けるのが難しくなるでしょう。@_の取り出しを、同時に全て一度にスカラに割り当てることが出来ます。$newString;}引数が多いサブルーチンや、いくつかの引数がオプションであるとか、他との組み合わせで使えないなら、最も良い方法は、サブルーチンの呼び出し時に、ユーザにハッシュの引数を渡させることです。@_をハッシュに取り出します。他のPerlの式と同様、サブルーチン呼び出しは、コンテキスト依存の振る舞いをします。"3"システムコール既に以下のPerlと関係ない事実をご存知でしたら申し訳有りません。WindowやLinux(また、多くの他のシステムでも同様と想定されますが)のシステムではプロセスが終わるたびに、16ビットの状態ワードで終了します。上位の8ビットは0〜255の間を含むリターンコードを構成します。0は慣例的に、無条件で成功したことを示します。他の値は様々な度合いの失敗を示します。他の8ビットはあまりよく調べられませんが、それらは"シグナルの死亡やコアダンプの情報のような失敗のモードを反映します"。Perlから終了する際に、exitを使って(0から255までの)好きなリターンコードを返せます。現在のスクリプトを止め、子プロセスが終わったら、現在のスクリプトの解釈を続けます。どの方法を使っても、その直後で、子プロセスの終了時に返された状態ワードが組込のスカラ変数の$?に入ります。system関数は他のプログラムを引数のリストと一緒に呼び出せます。"37"代わりに、バッククォート``を使って、コマンドラインで実際のコマンドを走らせて、コマンドからの標準出力をキャプチャできます。スカラコンテキストでは、全ての出力は単一の文字列として帰ります。リストコンテキストでは、全ての出力は一行ずつの文字列の配列として返されます。"foobarbaz"これは、anotherscript.plが含んでいたら、見られる振る舞いです。37;ファイルとファイルハンドルスカラ変数は、数字/文字列/リファレンスやundefの代わりにファイルハンドルも持てます。ファイルハンドルは基本的に特定のファイルの特定の場所を示すリファレンスです。openを使って、スカラ変数をファイルハンドルにします。openはモードとともに使われなければいけません。".$!;}成功すれば、openは真を返します。なければ、偽を返し、エラーメッセージが組み込みの変数$!に入ります。演算子が完全に成功したかを常にチェックすべきです。".$!;open呼び出しの引数に括弧が必要なことに注意してください。ファイルハンドルからテキストの行を読むために、組込関数のreadlineを使えます。readlineは、テキストの一行全体を、その終わりに改行をそのまま含んで返す(たぶんファイルの最終行を除いて)か、ファイルの最後に達するとundefを返します。$lineに対してその場で働きます。$lineは多分お望みのものではないでしょう。$fh)を使うのは注意してください。$lineが"0"で合った場合、ループは早くに終わってしまいます。そのように書きたいのならば、Perlには<>演算子があり、少し安全な方法でreadlineをラップしています。$_...}ファイルに書き込む場合は、違ったモードで最初に開きます。書き込み用にファイルを開くことを指示します。(>は、目的のファイルの中身を壊します。それから、print関数の0番目の引数として、ファイルハンドルを単に渡します。nest";printで$fh2と次の引数の間にカンマがないことに気をつけてください。ファイルハンドルはスコープを抜けると自動的に閉じられます。STDINとSTDOUTとSTDERRがあります。これらはスクリプトが開始されたときに自動的に開かれます。<STDIN>;ユーザーがエンターを押すまで待つだけです:<STDIN>;<>をファイルハンドルなしで呼ぶと、STDINからデータを読むか、Perlスクリプトが呼ばれた時の引数に渡された名前のファイルから読みます。分かるかと思いますが、printは、ファイルハンドルが省略された場合は、デフォルトでSTDOUTに出力しますす。組込の関数で与えられた名前のファイルが存在するかどうかをテストします。組込の関数で与えられた名前のファイルがディレクトリかどうかをテストします。組込の関数で与えられた名前のファイルが普通のファイルかどうかをテストします。-X形式の大きなクラスの関数の3つの関数です。Xは小文字か大文字です。これらの関数はファイルテストと呼ばれます。マイナス記号が先に来ることに気をつけてください。Googleクエリでは、マイナス記号は、その言葉を結果に含めないことを指示します。Perl以外の多くの言語やツールにみられます。Perlのコアの正規表現シンタックスは他のものと基本的に同じです。良いアドバイスをするとしたら、可能な限りこういた複雑なものを避けるということです。m//を使ってされます。m//は、成功なら真を返し、失敗なら偽を返します。"success";}括弧はサブマッチになります。Vietnam"$stringの中身を変更する方法に注意してください。操作の左側にスカラ変数を渡さなければなりません。リテラルの文字列を渡した場合、エラーになります。/gフラグは"グループマッチ"を指示します。呼び出しは前のものの後の他のマッチを探し、成功すると真を返し、失敗すると値を返します。ある方法で$1などにアクセス出来ます。m//g呼び出しは、マッチしたものを一度に全部返します。s///g呼び出しはグローバルな検索/置換でマッチした数を返します。ここでは、すべての母音を文字"r"に置換しています。フラグはマッチと置換をケースインセンシティブにします。trueモジュールとパッケージPerlにおいて、モジュールとパッケージは別物です。モジュールは、他のPerlファイル(スクリプトかモジュール)に含めることが出来る.pmファイルです。Perlスクリプトとまったく同じシンタックのステキストファイルです。/foo/bar/baz/Demo/StringUtils.pmにあります。1;モジュールはロードされると、最初から最後まで実行されるので、ロードが成功したことを示すために、最後に真の値を返す必要があります。Perlインタープリタはそれらを見つけることができるためには、perlを呼ぶ前に、Perlモジュールが入っているディレクトリが環境変数PERL5LIBにリストされているべきです。モジュールが入っているルートディレクトリをリストしてください。モジュールのディレクトリやモジュール自身をリストしてはいけません。PERL5LIB=/foo/bar/baz:$PERL5LIBPerlモジュールが作られて、perlがそれがどこにあるかを知っていれば、組込のrequire関数を使って探し、Perlのスクリプト中で実行することができます。Demo/StringUtils.pmというファイルを探します。モジュールがロードされたら、そこで定義されたサブルーチンは、突然にメインスクリプトから利用できるようになります。この例のスクリプトをmain.plと呼びましょう。呼んでいて、それぞれのモジュールがさらにrequireを呼んでいる場合、zombify()サブルーチンの元の宣言がどこにあるのか、追いにくくなります。その解決策としては、パッケージを使うことです。パッケージpackageは名前空間で、その中で、サブルーチンを宣言できます。宣言したサブルーチンは、暗黙的に、現在のパッケージ内に宣言されます。"kingedward";}名前空間の区切りに::を使っているのに注意してくださいサブルーチンを呼んだときはいつでも、暗黙に現在のパッケージ内のサブルーチンを呼んでいます。代わりに、パッケージを明示的に書くこともできます。brrrns"では、次はちょっと注意して読んでください。パッケージとモジュールの2つは、プログラミング言語Perlにおいて完全に分かれており、区別された機能です。この2つが同じダブルコロンのデリミタを使っていることは、大きなひっかけです。これは、スクリプトまたはモジュールのコース経由でパッケージを複数回切り替えることができ、また、複数のファイル内の複数の場所で同一のパッケージ宣言を使うこともできます。Foo::Barを呼ぶことはFoo::Bar名前空間にあるサブルーチンやパッケージ変数を必ずしもロードしませんし、Foo::Bar名前空間のサブルーチンを必ずしもロードするわけではありません。Foo::Barを呼ぶことは、単にFoo/Bar.pmというファイルをロードするだけであり、そのファイルに、どのような種類のパッケージ宣言も必要有りません。Baz::Quxのようなナンセンスな宣言もできます。その上、Baz::Qux::processThis()のサブルーチン呼び出しは、Baz/Qux.pmという名前のファイル内に宣言されている必要すらありません。文字通り、どこにでも定義することができます。この2つのコンセプトを分けてしまったことは、Perlの最も愚かな特徴の1つであり、これら2つのコンセプトを分けて取り扱ってしまうと常に、カオスで気の狂ったようなコードとなります。幸運なことに、Perlプログラマの多くは、次の2つの規則に従っています:Perlスクリプト(.plファイル)は、1つのpackage宣言も含まない。Perlモジュール(.pmファイル)は、1つのpackage宣言を含み、名前と場所が一致している。Demo::StringUtilsで始まっている。信頼できるサードパーティに作られた、ほとんどの"パッケージ"と"モジュール"を見つけることができ、相互に関係し参照することができます。これが当たり前と思わないことは重要です。いつか、常軌を逸した人が作ったコードに出会うでしょう。shows.PerlはOOプログラミングに、あまり適した言語ではありません。PerlのOO能力は後付のものです。そのリファレントがクラスに属していることをリファレンスに教えるために、blessを使います。blessにより、どのクラスがどのリファレントに属するのかを分かるようになります。リファレンスのリファレントがどのクラスに属しているかをみつけるためには、refを使いますメソッドは単純に第一引数オブジェクト(または、クラスメソッドであれば、パッケージ名)であるサブルーチンです。クラスメソッドはPackage::Name->method()です。クラスは単純にメソッドを含むパッケージです。以下、簡単な例でそれをはっきりさせます。文字通り、どのようなリファレンスも、どのようなクラスにでもblessすることができます。(1)リファレンスが実際にそのクラスのインスタンスとして使われているかと、(2)問題のクラスが存在し、ロードされているかを保証するのはあなた次第です。leg(s)";ですが、同じ->オペレータでオブジェクトからメソッドを呼ぶこともできます。"eucalyptus")と同じです。コンストラクタコンストラクタはクラスメソッドで、新しいオブジェクトを返します。コンストラクタが欲しければ、それを宣言するだけです。好きな名前を使えます。クラスメソッドには、最初の引数として、オブジェクトではなくクラス名が渡ります。parentを使います。Animalをサブクラス化してKoalaでサブクラスを作るとします。パッケージには定義されていません。"eucalyptus")を代わりに呼ぼうとして、代わりにそれは動きます。次のことに注意してください。クラスAnimalはKoala.pmで自動的ににロードされました。親クラス名のリストを受け取れます。多重継承をサポートします。全ての利益と恐怖を伴いますが。BEGINブロックBEGINブロックはperlがそのブロックをパースし終えるとすぐに実行されます。コンパイラがまだ全てをパースしていなくてもです。BEGINブロックは実行時には無視されます。third";BEGINブロックは常に最初に実行されます。上から順番にコンパイラがそれらに出会う順番に実行されます。BEGINブロックは常に最初に実行されます。this)に書かれていたりしても。コードの自然な順番をめちゃくちゃにしないでください。BEGINブロックは最初に書くこと!BEGINブロックはそのブロックが解釈されたと同時に実行されます。一度実行されると、コードのパースはBEGINブロックの終わりで再開されます。一度スクリプト全体かモジュールがパースされていれば、BEGINブロックの外側のいずれかが実行されます。here.コンパイル時に実行されるので、BEGINブロックが条件ブロックの中にあっても、まだ最初に実行されます。条件の評価が偽であり、条件がまだまったく評価されていないにもかかわらず、実際には、評価されることがないとしてもです。etc.}}useいいでしょう。わかりにくい、パッケージ、モジュールクラスメソッドとBEGINブロックの意味を理解したので、よく見かけるuse関数について説明できます。Caterpillar;Caterpillar->import();}いいえ、3つの例は間違った順番ではありません。Perlが馬鹿なだけです。useの呼び出しはBEGINブロックに変換されます。同じ警告が適用されます。useステートメントはファイルの最初に置かれなければいけません。条件の中に置いてはいけません。Perlの組込の関数ではありません。ユーザー定義のクラスメソッドです。import()を定義するか、継承するかの義務はCaterpillarパッケージのプログラマにあり、メソッドは理論上、どのような引数でも受け入れ、どのようなことでもできます。Captepillar.pmのドキュメントを読んで、何が起きるか正確に調査してください。CaterpillarがCaterpillar.pmという名前のmoduleをロードすることに注意してください。package内に定義されたimport()サブルーチンを呼びます。モジュールから継承することです。コアモジュールで、プログラミング言語Perlのデファクトのコアの機能です。Exporterのimportの実装で、渡した引数のリストは、サブルーチンの名前として解釈されます。サブルーチンがimport()されると、現在の名前空間で、そのオリジナルの名前空間にあるかのと同じように、利用可能になります。このコンセプトは例を使うと把握しやすいでしょう。1;パッケージ変数@EXPORT_OKにサブルーチン名のリストを含むべきです。コードの別の部分が、名前でこれらのサブルーチンをimport()するでしょう。inch"このケースでは、現在のパッケージはmainです。そのため、crawl()の呼び出しは、実際には、main::crawl()を呼びます。これは、Caterpillar::crawl()にマップされています(インポートされたので)。bloop"Perlにはプライベートメソッドはありません。慣例的に、プライベート用のメソッドは1つか2つのアンダースコアを頭につけた名前をつけます。@EXPORTと呼ばれるパッケージ変数も定義します。ここにもサブルーチン名のリストを入れます。import()が引数なしで呼ばれた場合にエクスポートされます。この例で起きることが起きます。bloop"ですが、ここでシチュエーションにどのように戻るか注意してください。他のものなしに、crawl()がもともとどこで定義されているかを知るのは簡単ではありません。Exporterを使うモジュールを作る際には、デフォルトでサブルーチンをエクスポートする@EXPORTを使わないこと。("crawl")を使って。Caterpillar.pmにcrawl())の定義があるという強いヒントになります。モジュールをuseすると、常に明示的にimport()したいサブルーチンの名前書きます。().その他の注意コアモジュールData::Dumperは任意のスカラをスクリーンに出力するのに使えます。これは基本的なデバッグツールです。delete};多くの他のクォートライクなオペレータがあります。演算子で、正規表現の区切り文字にスラッシュの代わりにブレースを使えます。これは、正規表現が多くのスラッシュやバックスラッシュを含む場合に、非常に有用です。m{///}は、前方の3文字のスラッシュにマッチします。URLからプロトコル部分を削除します。Perlには定数があります。気落ちするようなものですが、常にではありません。定数は実際には、ブラケットを省略したただのサブルーチン呼び出しです。時々、ハッシュのキーでクォートを省略して、$hash{key}を$hash{"key"}の代わりに使います。この状況では、裸のkeyは、"key"になるからです。key()のようにすると、サブルーチン呼び出しになります。<<EOFのように、2つの山括弧で区切られてラップされた整理されていないコードのブロックを見たら、Google検索のためのマジックワードは"ヒアドキュメント(here-doc)"です。多くの組込関数では、引数なしで呼ぶと$_が代わりに渡されます。defined;}私は、この形は嫌いです。リファクタリングの際に、問題を起こすことがあるからです。これで、2.5時間です。