安全打印(例如,避免终端控制序列)

时间:2014-08-25 11:39:17

标签: perl terminal printf

如何在打印或安全打印前清洁字符串?
我想删除所有终端控制序列和其他潜在风险的序列。

3 个答案:

答案 0 :(得分:0)

翻译可能是:

$str =~ tr/\x00-\x08\x0B-\x1F\x7F//;

这是除了制表符和换行符之外的ASCII控制字符。

答案 1 :(得分:0)

这种方式可能有效,具体取决于您的需求:它会删除所有不是字母数字或空格的内容:

my $junk  = "\t\r\n\e  hello\x00\x01\x02\x03\x04\x0b";

print length($junk), "\n";  # 17
$junk =~ s/[^\w\s]//g;
print length($junk), "\n\n";  # 10

my $junk2 = "\x00\x01\x02\x03\x04\x0b";

print length($junk2), "\n";  # 6
$junk2 =~ s/[^\w\s]//g;
print length($junk2), "\n";  # 0

答案 2 :(得分:0)

您可以指定要保留的字符,而不是专注于要删除的内容。以下是一个正则表达式,用于删除任何不是单词字符,间距或标点符号的内容:

s/[^\w\s[:punct:]]+//g;

以下演示了几个样本行。它使用Data::Dump方便地显示字符串的内部结构:

use strict;
use warnings;

use Data::Dump qw(dump);

my @data = (
    "Hello World\t\r\n\e\x00\x01\x02\x03\x04\x0b",
    'Testing Punctuation - `~!@#$%^&*()_+-={}|[]\:";\'<>?,./'
);

for (@data) {
    print "   Orig: " . dump($_) . "\n";
    s/[^\w\s[:punct:]]+//g;
    print "Cleaned: " . dump($_) . "\n\n";
}

输出:

   Orig: "Hello World\t\r\n\e\0\1\2\3\4\13"
Cleaned: "Hello World\t\r\n"

   Orig: "Testing Punctuation - `~!\@#\$%^&*()_+-={}|[]\\:\";'<>?,./"
Cleaned: "Testing Punctuation - `~!\@#\$%^&*()_+-={}|[]\\:\";'<>?,./"