Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl上用更少的代码行实现此算法_Perl - Fatal编程技术网

在Perl上用更少的代码行实现此算法

在Perl上用更少的代码行实现此算法,perl,Perl,我想用Perl实现这个算法。 让我们接受这一点: DNA1=GACTAGGC DNA2=AGCTAGA DNA1的第一个元素是G,我们将发现DNA2处是否有G,并用一个点指向它。我们将其一直延续到最后,这样图像显示的每个元素的交点都与一个点相同 下一步是:连接点。要指向点,第一个点应该位于小正方形的左上角,另一个点应该位于右下角(我的意思是线应该有135度),如果严格度为2,这意味着拒绝从2点到小于2点出现的线(这意味着如果严格度为3,则图像上只有一条线) 最后一步是:字数。如果wordc

我想用Perl实现这个算法。 让我们接受这一点:

  • DNA1=GACTAGGC
  • DNA2=AGCTAGA

DNA1的第一个元素是G,我们将发现DNA2处是否有G,并用一个点指向它。我们将其一直延续到最后,这样图像显示的每个元素的交点都与一个点相同

下一步是:连接点。要指向点,第一个点应该位于小正方形的左上角,另一个点应该位于右下角(我的意思是线应该有135度),如果严格度为2,这意味着拒绝从2点到小于2点出现的线(这意味着如果严格度为3,则图像上只有一条线)

最后一步是:字数。如果wordcount为1(在图像中为1),则表示逐个比较元素。如果是3,则表示将其中的3个进行比较。您可以编写wordcount为1的程序,因为它始终为1

我搜索了一下,我得到的是:

$infile1 = "DNA1.txt";
$infile2 = "DNA2.txt";

$outfile = "plot.txt";
$wordsize=0;
$stringency=0;

open inf, $infile1 or die "STOP! File $infile1 not found.\n";
$sequence1=<inf>;
chomp $sequence1;
@seq1=split //,$sequence1;
close inf;

open inf, $infile2 or die "STOP! File $infile2 not found.\n";
$sequence2=<inf>;
chomp $sequence2;
@seq2=split //,$sequence2;
close inf;

$Lseq1=$#seq1+1;
$Lseq2=$#seq2+1;

open ouf, ">$outfile";

for ($i=0;$i<$Lseq1;$i++){
print ouf "\n";
for ($j=0;$j<$Lseq2;$j++){
  $match=0;
  for ($w=0;$w<=$wordsize;$w++){
    if($seq1[$i+$w] eq $seq2[$j+$w]){
      $match++;
    }
  }
  if($match > $stringency){
     print ouf "1";
  }
  else{
     print ouf "0";
  }
}
}
编辑3:这里有一个更好的算法建议:


任何根据更好的算法改进代码的想法都是受欢迎的。

首先,最内层的for循环完全没有必要。摆脱它将加快你的代码

其次,您的代码不适用于0以外的$stringency

修正:

你会得到这样的结果

01000110
10001002
00100000
00020000
10003001
02000410
01000150
00200000
顺便说一句,我们试图实现的目标与找到目标非常相似

更新从文件中获取
$s1
$s2
,一次一行

open(my $fh1, '<', ...) or die(...);
open(my $fh2, '<', ...) or die(...);

for (;;) {
    my $s1 = <$fh1>;
    my $s2 = <$fh2>;

    die("Files have different length\n")
        if defined($s1) && !defined($s2)
        || !defined($s1) && defined($s2);

    last if !defined(($s1);

    chomp($s1);
    chomp($s2);

    ... code to generate graph ...
}

open(my$fh1),首先,最内层的for循环完全没有必要。去掉它会加快代码的速度

其次,您的代码不适用于0以外的$stringency

修正:

你会得到这样的结果

01000110
10001002
00100000
00020000
10003001
02000410
01000150
00200000
顺便说一句,我们试图实现的目标与找到目标非常相似

更新从文件中获取
$s1
$s2
,一次一行

open(my $fh1, '<', ...) or die(...);
open(my $fh2, '<', ...) or die(...);

for (;;) {
    my $s1 = <$fh1>;
    my $s2 = <$fh2>;

    die("Files have different length\n")
        if defined($s1) && !defined($s2)
        || !defined($s1) && defined($s2);

    last if !defined(($s1);

    chomp($s1);
    chomp($s2);

    ... code to generate graph ...
}

打开(我的$fh1,'为什么代码要少一些,这已经很短了。事实上,如果我是你,我会添加一些代码,至少如果你把空格算为代码的话。如果可以的话,我想对它进行优化,例如在文件操作中,或者如果有,我也不确定代码是否有效。另外,这是我关于Perl问题的第三个主题所有这些评论都像是建议很短很好,但最后我只得到了一行答案。这就是为什么我想越来越多地优化它,因为它是Perl,我想知道是否有可能做更多的事情。这里有一些你应该添加的代码:
使用严格;使用警告;
更短的代码esn不能运行得更快。这只是作者炫耀自己编写模糊的、难以维护的代码的能力的借口。对于sig文件和Perl golf来说,这种事情可能很有趣,但它在用于实际工作的脚本中没有一席之地。为什么代码要少一些,这已经很短了。事实上,如果我是你,我会添加一些代码,至少如果你同意的话t空格作为代码。我想优化它,如果我可以的话,比如在文件操作中,或者如果有,我也不确定代码是否有效。还有一个,这是我关于Perl问题的第三个主题,所有这些问题的注释都像是建议,非常简短,但是最后我得到了所有的答案一行。这就是为什么我想对它进行越来越多的优化,因为它是Perl,我想知道是否有可能做更多的事情。这里有一些你应该添加的代码:
使用strict;使用warnings;
更短的代码不会运行得更快。这只是作者炫耀自己编写模糊、难以维护的代码的能力的借口n代码。对于sig文件和Perl golf来说,这种事情可能很有趣,但它在用于实际工作的脚本中没有位置。你能从文件中读取它们并在一行读取时拆分它们吗?@kamaci,当然你可以一次读取一行文件。我没有在我的脚本中包括,因为就问题而言,这是噪音。如果你你需要从文件中读取的帮助,我建议你创建另一个问题。我更改了从文件中读取的部分,但你的代码工作得很好,谢谢。你能从文件中读取它们并在一行读取时拆分它们吗?@kamaci,当然你可以一行一行地读取一个文件。我的脚本中没有包含这一问题,因为就我的问题而言,这是噪音如果你需要从文件中读取的帮助,我建议你创建另一个问题。我更改了从文件中读取的部分,但你的代码运行良好,谢谢。
print $L[$j];
01000110
10001002
00100000
00020000
10003001
02000410
01000150
00200000
open(my $fh1, '<', ...) or die(...);
open(my $fh2, '<', ...) or die(...);

for (;;) {
    my $s1 = <$fh1>;
    my $s2 = <$fh2>;

    die("Files have different length\n")
        if defined($s1) && !defined($s2)
        || !defined($s1) && defined($s2);

    last if !defined(($s1);

    chomp($s1);
    chomp($s2);

    ... code to generate graph ...
}