【发布时间】:2013-04-10 04:48:49
【问题描述】:
我刚刚了解到,在 Perl 中,给定模块的符号表存储在与模块名称匹配的散列中 - 例如,虚构模块 Foo::Bar 的符号表将是 %Foo::Bar。默认符号表存储在%main:: 中。出于好奇,我决定要查看%main:: 中的内容,因此遍历散列中的每个键/值对,边走边打印:
#! /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'";
}
输出如下所示:
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'
...
我期待看到 STDOUT 和 STDERR 文件句柄,也许还有 @INC 和 %ENV……我没想到看到的是非 ascii 字符……上面的代码块没有显示是输出的第三行实际上有一个表示不可打印字符的字形。
我运行脚本并按如下方式通过管道传输:
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 对不可打印字符的翻译,你就会清楚符号表中的值是什么。
-
哎呀,你是对的。我检查了键是否有不可打印的字符,但没有检查值!
标签: perl