2012-02-16 29 views
3

我試圖在Perl中打印遞歸數據結構以進行調試。哈希陣列的散列哈希,那種東西...檢測Perl字符串是否可打印

它的一些基本數據元素是可打印的字符串,所以我打印這些。不幸的是,一些基本的數據元素是二進制的(思考來自圖像文件的內容)。他們用亂碼搞砸了我的調試輸出。

我該如何檢測哪個是哪個,這樣我可以避免打印二進制文件,就好像它是一個字符串?

(我知道數據::自卸車的。我的問題是不是關於我是否應該複製這些功能,但有關如何文本和二進制字符串進行區分。)

回答

6

perlrecharclass定義了這些字符類:

所有可打印字符,不包括一個空間。任何圖形化的字符,即可見的字符。該類由所有字母數字字符和所有標點字符組成。

任何可打印的字符,包括空格。所有可打印的字符,即所有圖形字符的集合,以及那些也不是控制的空白字符。

所以你可以匹配不具有Unicode的屬性字符(注意資金P),例如:

/\P{XPosixPrint}/ 

我懷疑你真正想要的是檢測控制字符,它搞砸了終端(注意小寫p):

/\p{XPosixCntrl}/ 
+0

這必須是一些愚蠢的,但我發現:找不到Unicode的屬性定義「XPosixCntrl」 – 2012-02-16 20:06:27

+0

@JohannesErnst - 你請參閱daxim要求您注意*小寫*'p'的部分? – fennec 2012-02-16 22:30:38

+1

[5.12稱爲'\ p {Cntrl}'](http://perldoc.perl.org/5.12.0/perlrecharclass.html)。 – daxim 2012-02-16 22:53:41

2

像這樣的事情會得到你開始

$string_is_unprintable = $string =~ /[^\t\n\x20-x7e]/ 

根據您所在位置和終端設置,您可能還容忍字符序數值大於127(0x7F的)。