如何在打印或安全打印前清洁字符串?
我想删除所有终端控制序列和其他潜在风险的序列。
答案 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 - `~!\@#\$%^&*()_+-={}|[]\\:\";'<>?,./"