Perl 变量的前1000字节

Perl 变量的前1000字节,perl,text,binary-data,unpack,Perl,Text,Binary Data,Unpack,如果我想用变量的前1000个字节尝试这个猜测子程序,那么unpack的用法正确吗 #!/usr/bin/env perl use warnings; use 5.10.1; my $var = ...; my $part = unpack( 'b1000', $var ) ; sub is_binary_data { local $_ = shift; ( tr/ -~//c / length ) >= .3; } if ( is_binary_data( $p

如果我想用变量的前1000个字节尝试这个猜测子程序,那么
unpack
的用法正确吗

#!/usr/bin/env perl
use warnings;
use 5.10.1;

my $var = ...;
my $part = unpack( 'b1000', $var ) ;

sub is_binary_data {
    local $_ = shift;
    (   tr/ -~//c / length  ) >= .3;
}

if ( is_binary_data( $part ) ) {
    say "Binary";
}
else {
    say "Text";
}

不,这不是因为解包将创建一个由0和1组成的字符串(最多1000个),这肯定会通过ascii测试(我相信
tr、-,,c/length
is)

我建议只使用
substr($var,0,1000)


另外,可能
\r
\n
应该出现在
tr/

不,这不是因为解包将创建一个0和1的字符串(最多1000个),它肯定会通过ascii测试(我相信
tr,-~,c/length
is)

我建议只使用
substr($var,0,1000)


另外,可能
\r
\n
应该出现在
tr/

检查二进制数据的另一个选项可能是使用
Encode::Guess
(),该选项用于确定字符串的字符编码。将您已知的字符编码设置为它尝试的唯一选项;如果失败,您知道您有二进制数据。检查二进制数据的另一个选项可能是使用
Encode::Guess
(),该选项用于确定字符串的字符编码。将您已知的字符编码设置为它尝试的唯一选项;如果失败,你就知道你有二进制数据。当然要注意,从技术上讲,这会提取前1000个字符;如果
$var
是Unicode字符串,这可能会产生不同。我建议将
tr/
扩展为
\x09-\x0d-~
\x09-\x0d
与POSIX
[:space://code>等价,`-~`与POSIX
[:print://code>等价。这应该涵盖大多数人会考虑ASCII文本。如果
tr//
可以使用字符类,或者
s/[^[:print:][:space:][]g并没有慢15倍。@LeoNerd,这取决于你所说的“Unicode字符串”是什么意思。如果您是指使用UTF8=1格式存储的字符串,
substr($\u01000)
可以正常工作。如果您指的是包含255以上字符的字符串,那么这个问题就没有意义了。(人们找不到非字节内容的前1000个字节)当然要注意,从技术上讲,这会提取前1000个字符;如果
$var
是Unicode字符串,这可能会产生不同。我建议将
tr/
扩展为
\x09-\x0d-~
\x09-\x0d
与POSIX
[:space://code>等价,`-~`与POSIX
[:print://code>等价。这应该涵盖大多数人会考虑ASCII文本。如果
tr//
可以使用字符类,或者
s/[^[:print:][:space:][]g并没有慢15倍。@LeoNerd,这取决于你所说的“Unicode字符串”是什么意思。如果您是指使用UTF8=1格式存储的字符串,
substr($\u01000)
可以正常工作。如果您指的是包含255以上字符的字符串,那么这个问题就没有意义了。(无法找到非字节内容的前1000个字节。)