看清楚.. 这是 ? : 的结构, 那个 "指令" ( expression ) 不是在 : 那里完结. ?: 句式是这样用的:
$结果 = (情况) ? (情况为真时的回传给$结果的值) : (情况为假时的回传给$结果值)# 举例:
$x = 10
$y = $x >= 10 ? "yes" : "no"
print $y # yes
#也相当於:
if ($x>= 10) {$y="yes"} else {$y="no"}
所以, 其实您上面那一段的意思其实是:
sub prefix {my $file = shift
if ( -l $file ) {
return $link
}
else {
if ( -d $file && $indent != $depth ) {
return $dir
}
else {
if ( -d _ ) {
return $stop
}
else {
if ( -f _ ) {
return $reg
}
else {
return $spec
}
}
}
}
}
您可能发现, 上例并没有 "return" 这个动作动作出现, 不过, 在 perl 里, 一个 sub 中如果没有明言 return 甚麼的话, 那最後一个 expression 的结果就会是回传值.
顺便也说一下, 在 ?: 的结构里, 您不该写指令, 只该用来做逻辑比较 (如那些 >= != eq ne...), 因为其原意是将比较的最後结果回传给最左边的 $结果. 那就是说.. 其实你是可以写成这样 :
$x >= 10 ? { print "ok" } : { print "not ok" }但如果都写到这份上, 那还不如写 if ( ... ) { ... } else { ... }, 可读性高多了.
我假设你的“数字”都是按行存放的我还假设你的“数字”和重叠不会发生结尾不足等问题
以上假设都是非常小的问题,可轻松解决,在此只为解释方法省去不必要的麻烦
程序接口等自己完成
打开文件有两种方法,一种在一开始全部打开,一种边输出边打开
本人能力有限,就简单化为第一种
前提,已知“数字”个数,即<输入文件>行数
可用shell, wc -l得到行数
my $line_number = 300
my $contig = 100
my $overlap = 20
my $nolap = $contig - $overlap
my $start = 0
my %hash
while (1)
{
my $name = "句柄名字"
$hash{$start} = $name
my $over = $start + $contig
open $name ">", $start ..$over " ...
$name = "新的句柄名字" # 自己想办法循环有效地转换句柄名称,可用正则等
$start = $start + $nolap # 开始位置改变
last, if ($over == $line_number)# 超过了就跳出
}
my $i # 计数器
my @print# 句柄数组
$start = 0
while ( <输入文件>)
{
my $line = $_
if ($i == $start)
{
push @print, $hash{$start}
$start = $nolap + $nolap
&printout(\@print, $line)
}
}
sub printout
{
my @print = @{$_[0]}
foreach (@print)
{
print {$_} $_[1]
}
}
以上,都是我自己现写的,没有测试的半伪代码,很有可能有致命错误,仅供参考
看到FASTA我就开心了,果然是搞生物的同行,互相学习了。
P.s 这样的程序你们的前辈应该有,管他们要吧,那些程序优化过,更成熟,如果得到了给我发一份学习下~谢
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)