Właśnie dowiedziałem się, że w Perlu tabela symboli dla danego modułu jest przechowywana w haszowniku, który pasuje do nazwy modułu - tak, na przykład, tablica symboli dla fikcyjnego modułu Foo::Bar
byłaby %Foo::Bar
. Domyślna tabela symboli jest przechowywana w %main::
. Właśnie ze względu na ciekawość, postanowiłem, że chciałem zobaczyć, co było w %main::
, więc powtórzyć za pośrednictwem każdej pary klucz/wartość w tablicy asocjacyjnej, drukując je jako Poszedłem:Co oznaczają znaki niedrukowalne w tabeli symboli Perla?
#! /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'";
}
Wyjście wyglądał następująco :
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'
...
spodziewałem się zobaczyć stdout i STDERR uchwytów plików, a może @ INC i% ENV ... co ja nie spodziewałem się zobaczyć było znaków spoza ASCII ... co blok kodu powyżej nie pokazuje, że trzecia linia wyjścia rzeczywiście zawierała glif wskazujący na niedrukowalną postać.
wpadłem skryptu i rurami go w następujący sposób:
perl /tmp/asdf.pl | grep '[^[:print:]]' | while read line
do
echo $line
od -c <<< $line
echo
done
Wyjście wyglądał następująco:
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
Więc jakie są niedrukowalne znaków robi w tablicy symboli Perl? Po co są te symbole?
Nie wiem, ale wygląda na to, że wszystkie klucze niedrukowalne mają tę samą wartość, '* main ::'. –
W rzeczywistości jest to po prostu artefakt o f fakt, że glify znaków kontrolnych zostały usunięte po wklejeniu do StackOverflow. Spróbuj uruchomić mój kod powyżej lub jeszcze lepiej kod zawierający tłumaczenie znaków niedrukowalnych autorstwa ilmari, a stanie się jasne, jakie wartości znajdują się w tabeli symboli. –
Ups, masz rację. Sprawdziłem klucze dla znaków niedrukowalnych, ale nie wartości! –