5

申し訳ありませんが、明確な質問ではないかもしれませんが、私が読んでいることを理解せずに何かを読むのは好きではないので、私はそれを求めています。

これが「プログラミングPerl」のスニペットです。

何かを逆参照する方法は、常に探している指示対象の種類を示すため、typeglobにはさまざまなタイプの複数の指示対象が含まれているにもかかわらず、typeglobは参照と同じように使用できます。したがって ${*main::foo}${\$main::foo}両方が同じスカラー変数にアクセスしますが、後者の方が効率的です。

私にとってこれは間違っているように思われます、そしてそれがこのようであるならばそれは正しいでしょう:

参照は常にスカラーであり、コンパイラーは必要なものを認識しているため、スカラー変数の代わりにtypeglobを使用できます。

本のテキストから、読者は、参照がスカラー変数(つまり、シンボルテーブルのスカラーエントリ)以外のものである可能性があると想定できます。警告を見たら:use of array as a reference is deprecated、それで、「プログラミングPerl」のこの段落は意味があるように見えます。なぜなら、参照は単なるスカラーではなく、新しい第4版では、現代のPerlに準拠するように変更されていないからです。 。

この本の正誤表のページを確認しましたが、何も見つかりませんでした。

私の仮定は正しいですか?そうでなければ、私が間違っているところで、誰かが説明するのがとても楽しいでしょう。

前もって感謝します。

4

3 に答える 3

15

いいえ、それが言っているのは、通常の参照とは異なり、型グロブには同時に複数の型が含まれているということです。ただし、それを逆参照する方法は、必要なもののタイプを示します。

use strict;
use warnings;
use 5.010;

our $foo = 'scalar';
our @foo = qw(array of strings);
our %foo = (key => 'value');

say ${ *foo };                  # prints "scalar"
say ${ *foo }[0];               # prints "array"
say ${ *foo }{key};             # prints "value"

通常の逆参照構文は、型グロブのどのスロットを逆参照するかを既に示しているため、特別な「型グロブ逆参照構文」は必要ありません。

myレキシカル変数は型グロブに関連付けられていないため、これは変数では機能しないことに注意してください。

補足:「参照としての配列」警告はこれとは関係ありません。次の構文を参照します: @array->[0]( と同じ意味$array[0])。これは、有効な構文であることを意図したものではありません。それは偶然に Perl 5 パーサーに組み込まれ、Larry が気づいた時点で廃止されました。

于 2012-08-24T09:34:46.410 に答える
1

これはあなたの質問に正確に答えるものではありませんが、型グロブで私が経験したことをお話しすることができます

型グロブを使用することは、コンパイラに「ここにヒントがあります。それをどうする必要があるかを自分で推測してください」と伝える一種の方法であるため、スカラーや参照よりも動的です。

参照には常に厳密な型と対象があります。型グロブには、この文字列を介してアクセスできる変数(名前)またはファイルハンドル(STDOUTなど)またはその他の値を指すことになっていることを示す文字列のみが含まれる場合があります。

型グロブでのみ可能な、いくつかの奇妙なことを達成するための perlish ハックがあります。そのため、現代の perl でも重要だと思います。

于 2012-08-24T09:33:31.190 に答える
1

PerlGuts の図解は、Perl の内部について学ぶためのアクセスしやすい方法です。

http://www.cpan.org/authors/id/GAAS/illguts-0.09.pdf

これまでの回答は何が起こっているかを示していますが、perl が変数を格納する方法を学ぶと、回答が実際には非常に単純であり、類推は実際には実装よりも明確ではないことがわかります。

PS: あなたが理解したいと思っていることは称賛に値します - それはあなたの将来の役に立つでしょう :)

于 2012-08-27T09:46:29.810 に答える