ファイルから特定のテキスト行をオブジェクトに分割し、それらのオブジェクトを配列に追加して、各要素を入力ファイルから 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";