我需要帮助弄清楚这两个子程序是如何工作的,以及它们返回的值或数据结构。下面是代码的最小表示:
#!/usr/bin/perl
use strict; use warnings;
# an array of ASCII encrypted characters
my @quality = ("C~#p)eOA`/>*", "DCCec)ds~~", "*^&*"); # for instance
# input the quality
# the '@' character in front deferences the subroutine's returned array ref
my @q = @{unpack_qual_to_phred(@quality)};
print pack_phred_to_qual(\@q) . "\n";
sub unpack_qual_to_phred{
my ($qual)=@_;
my $upack_code='c' . length($qual);
my @q=unpack("$upack_code",$qual);
for(my $i=0;$i<@q;$i++){
$q[$i]-=64;
}
return(\@q);
}
sub pack_phred_to_qual{
my ($q_ref)=@_;
@q=@{$q_ref};
for(my $i=0;$i<@q;$i++){
$q[$i]+=64;
}
my $pack_code='c' . int(@q);
my $qual=pack("$pack_code",@q);
return ($qual);
}
1;据我所知,unpack_qual_to_phread()子例程显然解密了存储在@quality中的ASCII字符元素。子例程读取包含ASCII字符元素的数组。数组中的每个元素都被处理并明显地解密。然后,子例程返回包含解密数组元素的数组引用。但是,我对Perl函数pack和unpack并不熟悉。另外,我在网上找不到任何好的例子。
我认为pack_phred_to_qual子例程将质量数组ref转换回ASCII字符并打印它们。
谢谢。如有任何帮助或建议,将不胜感激。另外,如果有人能够提供一个简单的例子,说明Perl的pack和unpack函数是如何工作的,这也会有所帮助。
发布于 2012-07-17 04:32:14
计算长度是不必要的。这些函数可以简化为
sub unpack_qual_to_phred { [ map $_ - 64, unpack 'c*', $_[0] ] }
sub pack_phred_to_qual { pack 'c*', map $_ + 64, @{ $_[0] } }在加密方面,这是一个疯狂的简单替换密码。它简单地从每个字符的字符数中减去64。它可以写成
sub encrypt { map $_ - 64, @_ }
sub decrypt { map $_ + 64, @_ }pack/unpack根本不考虑加密/解密;它只是对每个字节进行迭代的一种方式。
发布于 2012-07-17 04:25:00
这是相当简单的,作为包装。是调用unpack("c12", "C~#p)eOA/>*)‘,它依次接收每个字母并为该字母查找ascii值,然后从该值中减去64 (好吧,减去64是一个后处理步骤,与pack无关)。字母"C“是ascii 67,67-64是3。因此,这个函数的第一个值是3,其次是"~”,它是ascii 126。126-64是62.下一个是#,它是ascii 35,35-64是-29,等等.
从脚本生成的完整数字集是:
3,62,-29,48,-23,37,15,32,-17,-2,-22
“加密”步骤简单地逆转了这个过程。添加64,然后将其转换为字符。
发布于 2012-07-17 04:21:53
这不是你问题的完整答案,但你读过包囊吗?还是pack/拆包在perldoc上的文档?这些可能对你的理解有很大帮助。
编辑:
下面是一个简单的思考方法:假设您在内存中存储了一个4字节的数字,1234。如果它在perl标量中,$num,那么
pack('s*', $num)会回来
π♦或者不管"1234“的实际内部存储值是什么。因此,pack()将标量值作为字符串处理,并将其转换为数字的实际二进制表示(您可以看到打印出来的“pi-菱形”,因为这是该数字的ASCII表示)。相反,
unpack('s*', "π♦")返回字符串"1234“。
您的unpack()子例程的unpack_qual_to_phred()部分可以简化为:
my @q = unpack("c12", "C~#p)e0A`/>*");它将返回ASCII字符对的列表,每个字符对对应于第二个参数中的一个字节。
https://stackoverflow.com/questions/11515904
复制相似问题