13

私は何年もの間、断続的に Perl でプログラミングを行ってきましたが、私の主要言語は散発的にしかありません。私は何ヶ月も perl を書かないことがよくあるので、仕事のやり方を思い出させるために、私の犬耳の Camel Book に大きく依存しています。しかし、レシピをそのままコピーしてしまうと、よくわからないので困ってしまいます。これは最も厄介な問題の 1 つです。Camel の第 3 版の 154 ページに、「パッサンで文字列を変更する」の例があり、のようになっています。

($lotr = $hobbit) =~ s/Bilbo/Frodo/g;

Q1) ここで何が起こっているのですか? 正確には、正規表現は何に対して動作していますか?

Q2) この魔法に近い構文は、「$a から文字列を取得し、正規表現で変更し、結果を $b に配置する」などの基本的な操作に必要ですか?

Q3) ループのデフォルト変数を初期文字列として使用して、この操作を行うにはどうすればよいですか?

上記が完全に自然に見えるPerlの夢想家には、前もって謝罪してください。

4

3 に答える 3

22

うーん... ($lotr=$hobbit) =~ s/Bilbo/Frodo/gPerl の多くの魔法の 1 つです。いくつかの答えがあります。

Q1)$lotrに含まれる値が割り当てられています$hobbit。割り当ての後、ソース変数を忘れることができます。($lotr = $hobbit)次のように書いたかのように、それ自体のステートメントとして扱います。

$lotr = $hobbit;
$lotr =~ s/Bilbo/Frodo/g;

代わりは。正規表現は で動作してい$lotrます。

Q2) 構文は、上記のスニペットの単純な 1 行バージョンです。「 から文字列を$aコピーし、 にコピーし、正規表現で$b変更する」と考えてください。$b$a$b

Q3) 「ループデフォルト変数」とは、デフォルトのパターン検索空間を意味していると思いますか? その場合は、$_代わりに$hobbit次のように使用します。

while (<>) {
  chomp;
  ($lotr = $_) =~ s/Bilbo/Frodo/g;
  print "\$lotr = [$lotr]\n";
  print "\$_    = [$_]\n";
}

興味深いことに、マジック var$_はこの操作によって変更されません。これは、代入が正規表現置換のに行われ、置換がデフォルトのパターン空間とまったく相互作用しないと結論付ける方法です。

そして、経験豊富な Perl プログラマーのことについては...もちろん、シュワルツ氏を除いて、どれだけ長い間それを見つめていたかに関係なく、Perl 構文の一部によって投げ出された人をあまり知りません ;)

于 2008-12-07T02:11:01.453 に答える
5

言語が異なれば、代入演算子の使い方も異なります。一部では、式ではなくステートメントであるため、より大きな式に結合することはできません。一部では、割り当てられた値を返しますが、それ自体が変更または割り当て可能なもの (左辺値) としてではなく、値 (多くの場合、右辺値と呼ばれます) としてのみ返されます。この例は C で、次のように記述できます。

 a = b = c;  # assign value of c to b and a

だがしかし:

 ++(b = a);  # assign value of a to b, then increment b

また、割り当ての結果が割り当てられた左辺値になる場合もあります。(Perl では、これはスカラー代入にのみ適用されます。リスト代入はより複雑な獣です。) したがって、 ++($b=$a) または ($b=$a) =~ s/a/b/ または割り当てで左辺値を期待する他の操作。最初に割り当てを行い、次に割り当てられた左辺値をさらに変更します。

于 2008-12-07T02:40:12.830 に答える
1

Q2 で $a から部分文字列を取得する場合は、次のイディオムが役立つことがあります。

($b) = $a =~ /(substring-to-match)/;
$b =~ s/regex-on-susbtring/result-string/;

また、$a と $b は、並べ替え関数に関連する特別なスコープ規則があるため、Perl の通常の変数ではないことに注意してください。詳細については、「perldoc perlvar」を参照してください。

于 2008-12-07T03:07:58.423 に答える