0

単純な問題があると思います。最近、配列の各要素の文字列から特定の情報を抽出するスクリプトを実行しました。私は以前にこれを書いたことがあり、それはうまく機能しますが、今それの非常に単純なバージョンを試してみると、同じ応答の初期化されていない値の引数だけをデータに提示しません!以前のコードが機能するので、私は本当にイライラしています。私は明らかに愚かなことをしているので、助けが欲しいです!

#!/usr/bin/env perl

use strict;
use warnings;


my@histone;
my$line;
my$idea;
my$file="demo_site.txt";

open(IN, "<$file")||die"\ncannot be opend\n";

@histone=<IN>;
print @histone;

foreach $line(@histone)
       {
           $line=~ m/([a-zA-Z0-9]+)\t[0-9]+\t[0-9]+\t/;

           print$1."\n";
           print$2."\n";
           print$3."\n";

       }

インファイル「demo_site.txt」は、タブ区切りの.txtファイルの形式を取ります。

chr9        1234       5678     .     200      .      14.0      -1

このファイルには上記のように複数の行があり、最初の3つのデータ項目を抽出して、出力が次のようになるようにします。

chr9
1234
5678

乾杯!

4

5 に答える 5

3

タブで区切られているため、正規表現は実際には必要ありません。

foreach $line(@histone)
       {
           @line_data = split(/\t/,$line)

           print $line_data[0]."\n";
           print $line_data[1]."\n";
           print $line_data[2]."\n";

       }

編集:
特定の名前付き変数に値を割り当てる場合は、一時的な配列で割り当てます。

($varA, $varB, $varC .... ) = split(/\t/,$line)
于 2013-03-20T14:15:37.260 に答える
2

ここでの実際の問題は、、、の値を出力しようとしているが、$1正規表現には1セットのキャプチャ括弧しかないため、値のみを取得することです。未定義のままになるため、印刷しようとするとエラーが発生します。$2$3$1$2$3

解決策は、キャプチャ括弧のセットをさらに2つ追加することです。私はあなたがこのようなものが欲しいと思っています:

$line=~ m/([a-zA-Z0-9]+)\t([0-9]+)\t([0-9]+)\t/;
于 2013-03-20T14:55:44.947 に答える
1

あなたが望むものを持っていると仮定しましょうfile.txt:( file.txt eq demo_site.txt

chr9        1234       5678     .     200      .      14.0      -1

あなたは簡単なことを使うことができます:

perl -ane '$" = "\n"; print "@F[0..2]"' file.txt 1>output.txt

Perlのワンライナーは強力です。また、単純なタスクのためにスクリプトを作成する必要はありません;)

時々ターミナルを開くだけです;)

PS:

これはあまり良いワンライナーではありません、私は知っていますが、それはそれがしなければならないことをします。

于 2013-03-20T14:30:03.523 に答える
0

$ line =〜m /([a-zA-Z0-9] +)\ t [0-9] + \ t [0-9] + \ t /)

まず第一に、parensはバランスが取れていません。

第二に、私はこれをチェックしていませんが、キャプチャごとに一連のペアレンが必要ではありませんか?

第三に、misplacedmeが言ったように、split()は間違いなく進むべき道です。;)

于 2013-03-20T14:33:41.530 に答える
0

自己宣伝できる場合は、Tie :: Array :: CSVを使用して、arrayrefのPerl配列としてファイルへの直接の読み取り/書き込みアクセスを許可できます。

use strict;
use warnings;
use Tie::Array::CSV;
tie my @file, 'Tie::Array::CSV', 'demo_site.txt', sep_char => "\t";

print $file[0][0]; # first line before first tab
$file[2][1] = 10; # set the third line between the first and second tabs
于 2013-03-20T14:55:11.940 に答える