私は、Perlでは、与えられたモジュールのシンボルテーブルがモジュール名と一致するハッシュに格納されていることを知りました。例えば、架空のモジュールFoo::Bar
のシンボルテーブルは%Foo::Bar
です。デフォルトシンボルテーブルは%main::
に格納されています。Perlシンボルテーブルの印刷できない文字は何を表していますか?
#! /usr/bin/perl
use v5.14;
use strict;
use warnings;
my $foo;
my $bar;
my %hash;
while(my ($key, $value) = each %::) {
say "Key: '$key' Value '$value'";
}
を出力はこのように見えた:ちょうど好奇心のために、私は私が行ったように、それらをプリントアウトし、ハッシュ内の各キー/値のペアを通じて反復、私は%main::
にあったものを見たいと思ったことを決めました:
Key: 'version::' Value '*main::version::'
Key: '/' Value '*main::/'
Key: '' Value '*main::'
Key: 'stderr' Value '*main::stderr'
Key: '_<perl.c' Value '*main::_<perl.c'
Key: ',' Value '*main::,'
Key: '2' Value '*main::2'
...
私は私がした非ASCII文字を見て期待していなかったものを... STDOUTとSTDERRファイルハンドルを見て期待し、そしておそらく@INCと%ENVた...は、どのようなコードブロック出力の3行目が実際に印刷できない文字を示すグリフを持っているということです。
私は、スクリプトを実行し、次のようにパイプ:
perl /tmp/asdf.pl | grep '[^[:print:]]' | while read line
do
echo $line
od -c <<< $line
echo
done
出力はこのように見えた:
Key: '' Value '*main::'
0000000 K e y : ' 026 ' V a l u e '
0000020 * m a i n : : 026 ' \n
0000032
Key: 'ARNING_BITS' Value '*main::ARNING_BITS'
0000000 K e y : ' 027 A R N I N G _ B I
0000020 T S ' V a l u e ' * m a i n
0000040 : : 027 A R N I N G _ B I T S ' \n
0000060
Key: '' Value '*main::'
0000000 K e y : ' 022 ' V a l u e '
0000020 * m a i n : : 022 ' \n
0000032
Key: 'E_TRIE_MAXBUF' Value '*main::E_TRIE_MAXBUF'
0000000 K e y : ' 022 E _ T R I E _ M A
0000020 X B U F ' V a l u e ' * m a
0000040 i n : : 022 E _ T R I E _ M A X B
0000060 U F ' \n
0000064
Key: ' Value '*main:'
0000000 K e y : ' \b ' V a l u e '
0000020 * m a i n : : \b ' \n
0000032
Key: '' Value '*main::'
0000000 K e y : ' 030 ' V a l u e '
0000020 * m a i n : : 030 ' \n
0000032
だから、Perlのシンボルテーブルにやってない文字は何ですか?それらのシンボルは何ですか?
わかりませんが、印刷不可能なすべてのキーが同じ値を持つように見えますが、 '* main ::'。 –
実際、これは単なる人工物です。私がStackOverflowにペーストしたときにコントロール文字のグリフが削除されたという事実。上のコードを実行してみてください。あるいは、ilmariの印刷不可能な文字の変換を含むコードの方が良いでしょう。そして、シンボルテーブルの値が何であるかが明らかになります。 –
おっと、そうです。私は印刷できない文字のキーをチェックしましたが、値はチェックしませんでした! –