1

ファイルから特定のテキスト行をオブジェクトに分割し、それらのオブジェクトを配列に追加して、各要素を入力ファイルから 1 行に分割しようとしています。そこから、このスクリプトを呼び出したスクリプトが、オブジェクト内のタグをキーで参照できるようにする必要があります (すべてを print コマンドに渡し、呼び出し元のスクリプトで再構築するのではなく)。

私は最初の部分を動作させてテストしましたが、呼び出しスクリプトで送信または参照する方法が不明です。配列の各要素を出力しようとしましたが、それらはオブジェクトであるため、呼び出し元のプログラムでは、逆参照できませんでした。

配列を作成するファイルの簡易バージョンを次に示します。

#!/usr/bin/perl

use strict;
use warnings;
use CLASS::DATATYPE;

my $foundheaders = 0;
my $array_elem = 0;
my @MY_ARRAY = ();

open FH, '<', "dummy.txt";
# open FH, '<', "$ARGV[0]";

while (my $line = <FH>) {
    # once you've found the headers, this will begin to kickoff
    if ($foundheaders == 1)
    {
        # get line elements and create a new DATATYPE object using the elements
        # matched to the header index
        my @lineArray = split("\t", $line);
        my $thisdata = new CLASS::DATATYPE();

        $thisdata->FIRSTVAL(@lineArray[$HEADERS::FIRST]);
        $thisdata->SECONDVAL(@lineArray[$HEADERS::SECOND]);

        print "$thisdata\n";

        # Add new DATATYPE to the array
        $MY_ARRAY[$array_elem] = $thisdata;
        $array_elem ++;
    };

    # Search for line with "#R" at the beginning.  This will contain the headers
    if ($line =~ m/#R/ ) {
        # strip the first # symbol from the headers
        my $subline = substr $line, 1;
        chomp($subline);

        # split the line into an array and index headers
        my @headers = split("\t", $subline);
        &assign_headers(\@headers);

        # check off foundheaders flag
        $foundheaders = 1;
    };
};
close FH;

# test output value
my $test = $MY_ARRAY[2]->SECONDVAL();
print "$test\n";

1;

sub assign_headers
{
    package HEADERS;
    my @array = @{$_[0]};
    my $iter = 0;

    # check each array loop against known headers and assign the array index to header
    foreach (@array)
    {
        if ($_ eq "ROW1")
        {
            our $FIRST = $iter;
        };

        if ($_ eq "ROW2")
        {
            our $SECOND = $iter;
        };
        $iter++;
    }
}

print ステートメントは、データが少なくとも期待どおりに作成されたことを確認するために、そこにあるだけであることができます。

CLASS フォルダに保存されている DATATYPE パッケージは次のとおりです。

#!/usr/bin/perl

package CLASS::DATATYPE;

use strict;
use warnings;

sub new {
    my $self = {};
    $self->{FIRSTVAL} = undef;
    $self->{SECONDVAL} = undef;
    $self->{THIRDVAL} = undef;
    bless($self);
    return $self;
}

sub FIRSTVAL {
    my $self = shift;
    if (@_) { $self->{FIRSTVAL} = shift }
    return $self->{FIRSTVAL};
}

sub SECONDVAL {
    my $self = shift;
    if (@_) { $self->{SECONDVAL} = shift }
    return $self->{SECONDVAL};
}

1;

任意のダミー ファイルを使用しました。ヘッダー行が一致するものは何でも機能します。

## blah blah blah
## blah blah blah
#ROWS   ROW1    ROW2    ROW3
1   fwewef  aewf    sfd8y9
2   gereer  few79   dfsui
3   svfsg789    aferw789    uifdgs
4   dfsgy   78fer   fds
5   78fgds  sdf78y  sfdgh

呼び出しファイルは次のようになり、入力ファイルを渡して出力を取得します。

#!/usr/bin/perl

use strict;
use warnings;
use CLASS::DATATYPE;

my $file = "dummy.txt";

our @RESULTS = `/usr/bin/perl my_reader.pl $file`;

my $test = $RESULTS[2]->SECONDVAL();
print "$test\n";
4

1 に答える 1

1

私が言いたいことを説明するために私が思いつく唯一の方法は、あなたのためにプログラムを書くことです.

このプログラムはまさにあなたが必要としているものを実行します。同じことをするために不必要に膨大な量のコードを書いたことがお分かりいただけると思います.

私はあなたが選んだクラスを使いましたが、あなたが書いたのは Perl ハッシュを実装するクラスだけです。

私が使用した識別子の大文字化を遵守してください。Perl に詳しい人なら誰でも慣れているので、感謝するでしょう。

私が行った唯一の主要な追加はList::MoreUtils、関数にモジュールを使用することfirstidxです。指定されたテストに準拠するリストの最初の要素のインデックスを返します。これはコア モジュールではないため、インストールが必要な場合があります。本当に新しいモジュールをインストールできない場合は、プログラムに同等の関数を書くのは簡単なことです。それについて助けが必要な場合は、戻ってきてください。

念のため、このモジュールへの依存関係を削除するようにコードを更新しました。

クラスがコンストラクターのパラメーターから初期化子を取るようにしたので、各オブジェクトが作成されるときに値を割り当てることができます。また、変更後の値はあまり役に立たないため、アクセサーは変更前の値を返します。

read_maf必要なのは、他のファイル形式を処理する 2 番目のサブルーチンだけであり、複数のプロセスは必要ないことがおわかりいただけたと思います。

#!/usr/bin/perl

use strict;
use warnings;

use Class::DataType;

sub firstidx {
  my ($match, $list) = @_;
  for my $i (0 .. $#$list) {
    return $i if $list->[$i] eq $match;
  }
}

sub read_vcf {

  my ($filename) = @_;

  open my $fh, '<', $filename or die qq{Unable to open "$filename" for input: $!};

  my @columns;
  my @data;

  while (my $line = <$fh>) {
    chomp $line;
    if ( @columns ) {
        my @fields = split /\t/, $line;
        my $thisdata = Class::DataType->new(@fields[@columns]);
        push @data, $thisdata;
    }
    elsif ( $line =~ s/^#(?=R)// ) {
      my @headers = split /\t/, $line;
      @columns = map firstidx($_, \@headers), qw/ ROW1 ROW2 /;
    }
  }

  return \@data;
}

my $filename = 'dummy.txt';
my $results = read_vcf($filename);

my $test = $results->[2]->secondval;
print "$test\n";

そして、のClass::DataTypeコードClass/DataType.pm

package Class::DataType;

use strict;
use warnings;

sub new {
  my $package = shift;
  $package = ref $package if ref $package;
  my $self = {};
  @$self{qw/ firstval secondval thirdval /} = @_;
  bless $self, $package;
}

sub firstval {
    my $self = shift;
    my $retval = $self->{firstval};
    $self->{firstval} = shift if @_;
    return $retval;
}

sub secondval {
    my $self = shift;
    my $retval = $self->{secondval};
    $self->{firstval} = shift if @_;
    return $retval;
}

sub thirdval {
    my $self = shift;
    my $retval = $self->{thirdval};
    $self->{firstval} = shift if @_;
    return $retval;
}

1;

出力

あなたが与えたデータで、これは印刷されます

svfsg789
于 2013-02-23T00:30:38.190 に答える