0

私はしばらくこれに苦労していて、私が見逃した明らかな何かがあるかどうか疑問に思いました。

プログラミングの学習/実践として、制限酵素ダイジェストミックスの成分を計算するための簡単なスクリプトをまとめようとしています。ただし、最初に酵素ストック濃度のリストを取得する必要があります。

New England Biolabsの酵素ページから個々のページをすべて引き出しました。この現在のスクリプトでの私の目標は、酵素の名前と会社から入手できる濃度を引き出すことです。

この例は、EcoRIのローカルコピー(提出物の下部に含まれるリンク)で機能します。

use warnings;
use strict;
open(FILE,'productR0101.asp');
my $line;
my $counter;
my $array1;
my $array2;
my $array3;
my $concentration;
my @array4;
$counter = 1;

while ($line = <FILE>) {
    chomp($line);

    if ($counter == 6 ){
        $array1 = $line;
        $counter++;
    }
    else{
        $counter++;
    }

    if ($line =~ m/.{8}units.ml/g) {
        (@array4) =$line =~ m/.{8}units.ml/g;
        print @array4;
    }
}
print "\n".$array1;
exit;

すべてのファイルの6行目に酵素名が付いているので、その行全体をプルしました。ただし、濃度は異なる場所にあるため、私のアプローチは、ファイルを一度に1行ずつ読み取り、units/mlタグと一致させることでした。

私の考えでは、whileループが実行されるたびに、各行の一致があればそれを出力する必要があり、事実上、個別の印刷ステートメントの文字列が生成されます。

これは私がめちゃくちゃになるところです。このファイルには、units/mlタグが付いた6つの異なる場所があります。3つはfor 20,000、3つはfor100,000です。

6つの異なる結果が出力されることを期待していましたが、これを実行すると、1つの100,000 units/ml結果のみが返されます。

私はあらゆる種類の修正を試みました。文字列を連結して、文字列として格納してみました。行に触れない別の配列に連結してみましたが(@array4) = $line =~ m/.{8}units.ml/g、破損するか、同じ結果になります。

そして最後に、奇妙な慣習についてお詫び申し上げます。私はまだPerlを学んでおり、プログラミングの最初の経験はMATLABでした。

また、$array1$array2がどこに置かれているかを正確に追跡しようとしていたため、、、などが存在します。私の意図は、機能するようになったらクリーンアップすることです。

それで、誰かが私が間違っていることについて何か考えを持っていますか?

編集:データソースは、個々の酵素ページのソースコードです。この例では、ページソースを表示すると、スクリプトに与えた完全な入力ファイルを取得できます。

4

3 に答える 3

1

は行頭20,000 units/mlですか?その場合、.{8}一致に失敗するため、ドットは改行と一致せず、20,000_7 文字しかありません。

于 2012-08-14T21:15:48.883 に答える
0

入力データが何であるか正確にはわからないため、100,000 単位/ml の結果のうちの 1 つしか得られないというあなたが報告した動作を正確に再現することはできません. ただし、問題は正規表現にキャプチャがないことにあると思います。@array4 に返したい正規表現一致の部分を括弧で囲む必要があります。したがって、これの代わりに:

@array4 = $line =~ m/.{8}units.ml/g;

これを試して:

@array4 = $line =~ m/(.{8})units.ml/g;

@array4 = $line =~ /(.{8})units.ml/;

編集: m/ および /g 修飾子も使用したくありません。

于 2012-08-14T21:24:46.793 に答える
0

処理しているデータを実際に確認する必要がありますが、ファイルを 1 行ずつ読み取っているため、最後に出現し/units.ml/た inのみを保存しているように見えます。@array4

質問を補足する場合は、この回答に追加しますが、今のところ知る必要があります

  • データがどのように見えるか

  • 神秘的なものは何の/.{8}/ためにあるのか

  • $array1$array2、および$array3スカラーであり、変数の非常に悪い名前であることを認識していますか?

今のところ、慣用的な Perl を使用してコードを書き直し、$.最後に読み取ったファイルの行番号に評価される変数を次に示します。

use strict;
use warnings;

open my $file, '<', 'productR0101.asp' or die $!;

my $array1;
my @array4;

while (my $line = <$file>) {

  chomp $line;

  $array1 = $line if $. == 6;

  if ($line =~ m/.{8}units.ml/) {
    @array4 = $line =~ m/.{8}units.ml/g;
    print "@array4\n";
  }
}

print "\n".$array1;
于 2012-08-14T21:15:24.940 に答える