2

我有一个文件,其中包含 12 列(bam 文件),第 11 列包含 ASCII 代码。在一个文件中,我有多个 ASCII 码。我想将其转换为数字。我认为是这段代码:

perl -e '$a=ord("ALL_ASCII_CODES_FROM-FILE"); print "$a\t"'

我想创建循环以读取第十一列中的所有 ASCII 代码,将其转换为数字并将结果计数为一个数字。

4

2 回答 2

4

将字符串转换为相应 ASCII 代码列表的自然工具是unpack

my @codes = unpack "C*", $string;

特别是,假设您正在解析SAM 文件的 QUAL 列(或者,更一般地说,任何FASTQ 风格的质量字符串,我相信正确的转换将是:

my @qual = map {$_ - 33} unpack "C*", $string;

附言。从您提到的“列”中,我假设您实际上是在解析 SAM 文件,而不是 BAM 文件。如果我正确阅读规范,BAM 格式似乎没有使用 +33 偏移量作为质量值,因此如果您正在解析 BAM 文件,您只需使用上面的第一个示例即可。

于 2013-10-25T13:33:39.320 回答
4

您需要将字符串拆分为单个字符,遍历每个字符,然后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);
于 2013-10-25T11:36:45.400 回答