我正在尝试在Perl中打印递归数据结构以进行调试。散列哈希阵列的哈希,那种事......
它的一些基本数据元素是可打印的字符串,所以我正在打印它们。不幸的是,一些基本数据元素是二进制的(想想来自图像文件的内容)。他们用乱码打乱了我的调试输出。
我如何检测哪个是哪个,所以我可以避免打印二进制文件,就像它是一个字符串一样?
(我知道Data :: Dumper。我的问题不是关于我是否应该复制该功能,而是关于如何区分文本和二进制字符串。)
答案 0 :(得分:7)
perlrecharclass定义了这些字符类:
任何可打印字符,不包括空格。任何图形的字符,即可见的字符。该类由所有字母数字字符和所有标点符号组成。
任何可打印字符,包括空格。所有可打印字符,即所有图形字符的集合加上那些不是控件的空白字符。
所以你可以匹配一个没有Unicode属性的字符(注意大写P
),例如:
/\P{XPosixPrint}/
我怀疑你真正想要的是检测控制字符,这会搞砸终端(注意小写p
):
/\p{XPosixCntrl}/
答案 1 :(得分:3)
这样的事情会让你开始
$string_is_unprintable = $string =~ /[^\t\n\x20-x7e]/
根据您的区域设置和终端设置,您还可以容忍序号值大于127(0x7f)的字符。