argra****@users*****
argra****@users*****
2009年 1月 28日 (水) 20:46:34 JST
Index: docs/perl/5.10.0/perldebtut.pod diff -u docs/perl/5.10.0/perldebtut.pod:1.3 docs/perl/5.10.0/perldebtut.pod:1.4 --- docs/perl/5.10.0/perldebtut.pod:1.3 Tue Jan 20 01:17:32 2009 +++ docs/perl/5.10.0/perldebtut.pod Wed Jan 28 20:46:34 2009 @@ -823,12 +823,11 @@ 全く一貫していません! 手動でコードにブレークポイントをセットして、何が起きているかを見るために デバッガで実行してみます。 -A breakpoint is a flag, to which -the debugger will run without interruption, when it reaches the breakpoint, it -will stop execution and offer a prompt for further interaction. +ブレークポイントは、デバッガを中断なしで実行するためのフラグで、 +ブレークポイントに到達すると、実行を停止してさらなる対話のためにプロンプトを +出します。 通常の使用では、これらのデバッガコマンドは完全に無視され、これらは 製品コードに残しても安全です - すこし乱雑かもしれませんが。 -(TBT) my ($in, $out) = ($num, $num); $DB::single=2; # insert at line 9! @@ -1112,10 +1111,9 @@ =end original 本当に知りたかったですか? :-) -For more gory details on getting regular expressions to work, have a look at -L<perlre>, L<perlretut>, and to decode the mysterious labels (BOL and CURLYN, -etc. above), see L<perldebguts>. -(TBT) +正規表現の動作に関する詳細については、L<perlre>, L<perlretut> を、 +(上述の BOL や CURLYN などの)不思議なラベルを解読するには、 +L<perldebguts> を参照してください。 =head1 OUTPUT TIPS @@ -1179,10 +1177,9 @@ =end original -Just a quick hint here for all those CGI programmers who can't figure out how -on earth to get past that 'waiting for input' prompt, when running their CGI -script from the command-line, try something like this: -(TBT) +「入力待ち」プロンプトからどうやれば逃れられるのかが分からない全ての +CGI プログラマへの簡単なヒントとして、 +CGI をコマンドラインから実行するときに、以下のようなものを試してください: > perl -d my_cgi.pl -nodebug Index: docs/perl/5.10.0/perlretut.pod diff -u docs/perl/5.10.0/perlretut.pod:1.6 docs/perl/5.10.0/perlretut.pod:1.7 --- docs/perl/5.10.0/perlretut.pod:1.6 Sat Dec 27 04:58:23 2008 +++ docs/perl/5.10.0/perlretut.pod Wed Jan 28 20:46:34 2009 @@ -1345,6 +1345,8 @@ =head2 Matching this or that +(あれやこれやにマッチングする) + =begin original Sometimes we would like our regexp to be able to match different @@ -1439,6 +1441,8 @@ =head2 Grouping things and hierarchical matching +(グループ化と階層的マッチング) + =begin original Alternation allows a regexp to choose among alternatives, but by @@ -1561,11 +1565,10 @@ =end original -ある選択肢を試しマッチすればそれを選び、失敗した場合には次の選択肢へ移る -while going back in the string -from where the previous alternative was tried, +ある選択肢を試し、マッチすればそれを選んで次の選択肢へ移り、 +マッチしなければ文字列の以前の選択肢を試した場所に戻る、 という手順は I<バックトラッキング> (backtracking)と呼ばれます。 - 'バックトラッキング'という単語は正規表現のマッチングが森の中の散歩に +'バックトラッキング'という単語は正規表現のマッチングが森の中の散歩に 似ていることからきています。 正規表現のマッチングが成功することは目的地にたどり着くことです。 多くのtrailheadsがあり、文字列の各位置のひとつで左から右へと順序だてて @@ -1577,9 +1580,8 @@ 目的地に着いたなら、即座に止まって他の未知は忘れてしまいます。 あなたは粘り強いので、すべてのtrailheadsからすべての通り道を試してそれでも 目的地に着かなければ、失敗を宣言します。 -具体的に、Perlが正規表現のマッチを試しているときに行っていることをステップを -追って説明しましょう -(TBT) +具体的に、Perlが正規表現のマッチを試しているときに行っていることを +ステップを追って説明しましょう "abcde" =~ /(abd|abc)(df|d|de)/; @@ -1593,7 +1595,6 @@ =end original - 文字列の最初の文字 'a' から始めます。 =item 1 @@ -1604,7 +1605,6 @@ =end original - 最初のグループの中の最初の選択肢 'abd' を試します。 =item 2 @@ -1927,10 +1927,10 @@ =end original -Counting the opening parentheses to get the correct number for a -backreference is errorprone as soon as there is more than one -capturing group. A more convenient technique became available -with Perl 5.10: relative backreferences. To refer to the immediately +後方参照で正しい番号を得るために開きかっこを数えるということは、捕捉 +グループが複数になるとすぐに間違いを起こしがちになります。 +より便利なテクニックである相対後方参照が Perl 5.10 で利用可能です。 +To refer to the immediately preceding capture group one now may write C<\g{-1}>, the next but last is available via C<\g{-2}>, and so on. (TBT) @@ -1943,7 +1943,7 @@ =end original -相対バックリファレンスを使うために可読性と保守性を追加するもう一つの +相対後方参照を使うために可読性と保守性を追加するもう一つの よい理由は、以下の例で示すように、特定の文字列をマッチするために単純な パターンを使うところです: @@ -1956,9 +1956,8 @@ =end original -Now that we have this pattern stored as a handy string, we might feel -tempted to use it as a part of some other pattern: -(TBT) +ここで、このパターンを便利な文字列として持つことになったので、 +これを他のパターンの一部として使いたいと思うかもしれません: $line = "code=e99e"; if ($line =~ /^(\w+)=$a99a$/){ # unexpected behavior! @@ -1979,17 +1978,14 @@ =end original しかしこれはマッチングしません -- 少なくとも予想した通りには。 -Only -after inserting the interpolated C<$a99a> and looking at the resulting -full text of the regexp is it obvious that the backreferences have -backfired -- the subexpression C<(\w+)> has snatched number 1 and -demoted the groups in C<$a99a> by one rank. This can be avoided by -using relative backreferences: -(TBT) +変数展開された C<$a99a> を挿入した後でだけ、結果となる +正規表現のテキストを見ると、後方参照が逆効果となるのは明らかです -- + 部分式 C<(\w+)> が 1 番を奪ってしまい、C<$a99a> のグループが +1 つ格下げになります。 +これは相対後方参照を使うことで回避できます: $a99a = '([a-z])(\d)\g{-1}\g{-2}'; # safe for being interpolated - =head2 Named backreferences (名前付き後方参照) @@ -2006,14 +2002,14 @@ =end original -Perl 5.10 also introduced named capture buffers and named backreferences. -To attach a name to a capturing group, you write either -C<< (?<name>...) >> or C<< (?'name'...) >>. The backreference may -then be written as C<\g{name}>. It is permissible to attach the -same name to more than one group, but then only the leftmost one of the -eponymous set can be referenced. Outside of the pattern a named -capture buffer is accessible through the C<%+> hash. -(TBT) +Perl 5.10 では名前付きバッファと名前付き後方参照も導入されました。 +捕捉グループに名前を付けるために、C<< (?<name>...) >> または +C<< (?'name'...) >> と書けます。 +後方参照は C<\g{name}> と書けます。 +複数のグループに同じ名前を付けることは出来ますが、一番左のものだけが +参照可能です。 +パターンの外側では、名前付き捕捉バッファは C<%+> ハッシュを通して +アクセスできます。 =begin original @@ -2025,12 +2021,11 @@ =end original -Assuming that we have to match calendar dates which may be given in one -of the three formats yyyy-mm-dd, mm/dd/yyyy or dd.mm.yyyy, we can write -three suitable patterns where we use 'd', 'm' and 'y' respectively as the -names of the buffers capturing the pertaining components of a date. The -matching operation combines the three patterns as alternatives: -(TBT) +yyyy-mm-dd, mm/dd/yyyy, dd.mm.yyyy の 3 つの形式のどれか 1 つで +与えられる日付とマッチングしなければならないと仮定すると、 +'d', 'm', 'y' をそれぞれ日付の要素を捕捉するバッファの名前として使って、 +3 つの適合するパターンを書けます。 +マッチング操作は 3 つのパターンの選択として結合します: $fmt1 = '(?<y>\d\d\d\d)-(?<m>\d\d)-(?<d>\d\d)'; $fmt2 = '(?<m>\d\d)/(?<d>\d\d)/(?<y>\d\d\d\d)'; @@ -2065,7 +2060,7 @@ Yet another capturing group numbering technique (also as from Perl 5.10) deals with the problem of referring to groups within a set of alternatives. -Consider a pattern for matching a time of the day, civil or military style: +民間形式と軍形式の時刻にマッチングするパターンを考えます: (TBT) if ( $time =~ /(\d\d|\d):(\d\d)|(\d\d)(\d\d)/ ){ @@ -2087,8 +2082,8 @@ whether C<$1> and C<$2> or C<$3> and C<$4> contain the goodies. It would be easier if we could use buffer numbers 1 and 2 in second alternative as well, and this is exactly what the parenthesized construct C<(?|...)>, -set around an alternative achieves. Here is an extended version of the -previous pattern: +set around an alternative achieves. +これは以前のパターンの拡張版です: (TBT) if ( $time =~ /(?|(\d\d|\d):(\d\d)|(\d\d)(\d\d))\s+([A-Z][A-Z][A-Z])/ ){ @@ -3072,11 +3067,13 @@ =end original -With the introduction of the I<possessive quantifiers> in Perl 5.10, we +Perl 5.10 での I<所有格量指定子> の導入によって、 +we have a way of instructing the regex engine not to backtrack, with the usual quantifiers with a C<+> appended to them. This makes them greedy as well as stingy; once they succeed they won't give anything back to permit -another solution. They have the following meanings: +another solution. +これらは以下のような意味があります: (TBT) =over 4 @@ -3091,8 +3088,8 @@ =end original -C<a{n,m}+> means: match at least C<n> times, not more than C<m> times, -as many times as possible, and don't give anything up. C<a?+> is short +C<a{n,m}+> は: 最小で C<n> 回、最大で C<m> 回の間で出来るだけたくさん +マッチングし、and don't give anything up. C<a?+> is short for C<a{0,1}+> (TBT) @@ -3106,7 +3103,7 @@ =end original -C<a{n,}+> means: match at least C<n> times, but as many times as possible, +C<a{n,}+> は: 最小で C<n> 回で出来るだけたくさんマッチングし、 and don't give anything up. C<a*+> is short for C<a{0,}+> and C<a++> is short for C<a{1,}+>. (TBT) @@ -3329,8 +3326,8 @@ このような複雑なものにおいては、C<//x> 修飾子は重要なものです。 この修飾子は正規表現に対してその意味を変えることなく、ほぼ任意の空白を 入れたりコメントを入れたりすることを許します。 -これを使うことによって、よりわかりやすい形式に正規表現を「拡張」することが -できます +これを使うことによって、よりわかりやすい形式に正規表現を +「拡張」することができます =begin original @@ -3370,8 +3367,9 @@ =end original もし空白が余計なものであれば、拡張された正規表現にスペースを含ませるには -どうすればよいのでしょうか? その答えは S<C<'\ '>> のようにバックスラッシュを -前置するか、S<C<[ ]>> のように文字クラスに押し込めることです。 +どうすればよいのでしょうか? その答えは S<C<'\ '>> のように +バックスラッシュを前置するか、S<C<[ ]>> のように文字クラスに +押し込めることです。 同じことが '#' にも言えて、こちらも C<\#> か C<[#]> を使います。 たとえば、Perl が符号と仮数部(もしくは整数部) の間に空白を置くことを 許すとすると、以下のように正規表現に加えることができます: @@ -3561,11 +3559,14 @@ マッチさせる文字列を指定するために C<=~> 演算子や C<!~> 演算子を 使っています。 マッチング演算子について、単一行修飾子 C<//s>、複数行修飾子 C<//m>、 -大小文字の違いを無視する修飾子 C<//i>、拡張修飾子 C<//x> について述べました。 -マッチング演算子に関して、知っておきたいであろう二、三の事柄があります。 +大小文字の違いを無視する修飾子 C<//i>、拡張修飾子 C<//x> について +述べました。 +マッチング演算子に関して、知っておきたいであろういくつかの事柄があります。 =head3 Optimizing pattern evaluation +(パターン評価を最適化する) + =begin original We pointed out earlier that variables in regexps are substituted @@ -3573,7 +3574,8 @@ =end original -正規表現が評価されるよりも前に変数の置換が行われることをすでに説明しました: +正規表現が評価されるよりも前に変数の置換が行われることをすでに +説明しました: $pattern = 'Seuss'; while (<>) { @@ -3608,6 +3610,8 @@ =head3 Prohibiting substitution +(置換を禁止する) + =begin original If you change C<$pattern> after the first substitution happens, Perl @@ -3661,6 +3665,8 @@ =head3 Global matching +(グローバルマッチング) + =begin original The final two modifiers C<//g> and C<//c> concern multiple matches. @@ -3854,9 +3860,8 @@ =end original -はうまくいきません。 -これは C<TGA> にマッチはしますが、 S<C<GTT GAA>> のようにコドンの -境界にないものにもマッチしてしまいます。 +はうまくいきません; これは C<TGA> にマッチはしますが、 +S<C<GTT GAA>> のようにコドンの境界にないものにもマッチしてしまいます。 より良い解決策は以下のようなものです while ($dna =~ /(\w\w\w)*?TGA/g) { # note the minimal *? @@ -3897,7 +3902,7 @@ その答えは、私たちの正規表現が最後に本当にマッチしたところまでは うまくいっているからです。 それからこの正規表現は C<TGA> の同期に失敗して私たちが望んでいない場所から -マッチのステップを始めてしまうのです。 +マッチングのステップを始めてしまうのです。 解決策は、コドンの境界にマッチさせるために C<\G> を 使って印付けをすることです: @@ -3957,8 +3962,7 @@ C<regexp> にマッチした文字列を置き換えるものです。 C<=~> 演算子もまた C<s///> を伴った文字列に結びつけられるために 使われます。 -C<$_> に対してマッチングを行う場合には、S<C<$_ =~>> は省略することが -できます。 +C<$_> に対してマッチングを行う場合には、S<C<$_ =~>> は省略できます。 マッチに成功した場合には C<s///> は置換が行われた数を返し、失敗した 場合には偽を返します。 幾つか例を挙げましょう: @@ -4146,11 +4150,11 @@ C<split()> 関数は、正規表現が使えるもう一つの場所です。 C<split /regexp/, string, limit> は C<string> オペランドを部分文字列の リストに分割し、そのリストを返します。 -The regexp must be designed -to match whatever constitutes the separators for the desired substrings. -C<limit> が与えられた場合には、文字列を C<limit> 個を超える数には分割しません。 +正規表現は、目的の部分文字列のセパレータを構成するものに +マッチングするようにしなければなりません。 +C<limit> が与えられた場合には、文字列を C<limit> 個を超える数には +分割しません。 たとえば、文字列を単語に分割するには以下のようにします -(TBT) $x = "Calvin and Hobbes"; @words = split /\s+/, $x; # $word[0] = 'Calvin' @@ -4392,9 +4396,8 @@ 2) マッチング操作がバイト列ではなく、Unicode 文字列として扱うということです。 1)に対する答えは C<chr(255)> を越える Unicode 文字は C<\x{hex}> 表記を 使って表現されるだろうということです(ここで hex は十六進整数); -because the \0 octal and \x hex (without curly braces) don't go further -than 255. -(TBT) +なぜなら、8 進数の \0 表記と 16 進数の \x 表記(中かっこなし) は 255 を +超えないからです。 /\x{263a}/; # match a Unicode smiley face :) @@ -4795,7 +4798,7 @@ コンパイル済み正規表現は、現れるたびにコンパイルする必要のない動的な マッチングを生成するのに便利です。 -コンパイル済み正規表現を使って +コンパイル済み正規表現を使って、 we write a C<grep_step> program which greps for a sequence of patterns, advancing to the next pattern as soon @@ -5589,6 +5592,8 @@ =head2 Defining named patterns +(名前付きパターンを定義する) + =begin original Some regular expressions use identical subpatterns in several places. @@ -5641,6 +5646,8 @@ =head2 Recursive patterns +(再帰的パターン) + =begin original This feature (introduced in Perl 5.10) significantly extends the @@ -5733,7 +5740,7 @@ =end original 通常、正規表現は Perl の式の一部です。 -I<コード評価> (code evaluation) 式は任意のPerlのコードを正規表現の +I<コード評価> (code evaluation) 式は任意の Perl のコードを正規表現の 一部として使うことができるようにします。 コード評価式は C<(?{code})> で表され、I<code> は Perl の文である 文字列です。 @@ -5842,7 +5849,8 @@ =end original ふーむ。 -何が起きたのでしょう? 先のパターンが効果としては最後のものと +何が起きたのでしょう? +先のパターンが効果としては最後のものと 同じであることをあなたは知っています -- 文字クラスの中に閉じ込められた d はマッチを変えるものではありません。 では、なぜ最初のパターンは出力されないのに二番目のものは @@ -6199,7 +6207,7 @@ =end original -もう一つのコード式は I<パターンコード式>(pattern code expression ) です。 +もう一つのコード式は I<パターンコード式>(pattern code expression) です。 パターンコード式は通常のコード式に似ていますが、コードの評価結果が 正規表現として扱われ、即座にマッチに使われる点が異なります。 単純な例を挙げましょう @@ -6375,8 +6383,9 @@ the letter's counter. Then C<(*FAIL)> does what it says, and the regexp engine proceeds according to the book: as long as the end of the string hasn't been reached, the position is advanced before looking -for another vowel. Thus, match or no match makes no difference, and the -regexp engine proceeds until the the entire string has been inspected. +for another vowel. +従って、マッチングするのとしないのとは違いはなく、正規表現エンジンは +文字列全体が検査されるまで進められます。 (注目すべきことに、以下のような代替案は、 (TBT)