我有一个文件,其中包含 12 列(bam 文件),第 11 列包含 ASCII 代码。在一个文件中,我有多个 ASCII 码。我想将其转换为数字。我认为是这段代码:
perl -e '$a=ord("ALL_ASCII_CODES_FROM-FILE"); print "$a\t"'
我想创建循环以读取第十一列中的所有 ASCII 代码,将其转换为数字并将结果计数为一个数字。
我有一个文件,其中包含 12 列(bam 文件),第 11 列包含 ASCII 代码。在一个文件中,我有多个 ASCII 码。我想将其转换为数字。我认为是这段代码:
perl -e '$a=ord("ALL_ASCII_CODES_FROM-FILE"); print "$a\t"'
我想创建循环以读取第十一列中的所有 ASCII 代码,将其转换为数字并将结果计数为一个数字。
将字符串转换为相应 ASCII 代码列表的自然工具是unpack:
my @codes = unpack "C*", $string;
特别是,假设您正在解析SAM 文件的 QUAL 列(或者,更一般地说,任何FASTQ 风格的质量字符串,我相信正确的转换将是:
my @qual = map {$_ - 33} unpack "C*", $string;
附言。从您提到的“列”中,我假设您实际上是在解析 SAM 文件,而不是 BAM 文件。如果我正确阅读规范,BAM 格式似乎没有使用 +33 偏移量作为质量值,因此如果您正在解析 BAM 文件,您只需使用上面的第一个示例即可。
您需要将字符串拆分为单个字符,遍历每个字符,然后ord
在循环中调用。
my @codes = map ord, split //, $str;
say join '.', map { sprintf("%02X", $_) } @codes;
方便地,unpack 'C*'
完成所有这些。
my @codes = unpack 'C*', $str;
say join '.', map { sprintf("%02X", $_) } @codes;
如果您确实打算以十六进制打印出来,您可以v
在 a 中使用修饰符printf
。
say sprintf("%v02X", $str);