2016-12-09 3 views
-2

私はExcelファイルからデータを読み込んで配列にプッシュするperlスクリプトを持っています。私は構造にそれらを整理したい多くのそのような配列を持っています。 私の配列のように見ることができます:私は以下のような構造にそれらを整理したい配列を組み合わせて構造体を作るためのPerlスクリプト

@keys = {1,2,3,4}; 
@names = {A,B,C,D}; 
@var = {var1,var2,var3,var4}; 
@count = {c1,c2,c3,c4}; 

同様
struct 1{ 
    A; 
    var1; 
    c1; 
} 
struct 2{ 
    B; 
    var2; 
    c2; 
} 

、私も他の構造体を整理したいです。最後に、すべての構造体の配列を作成したいと思います。私はそのデータの参照名を使って構造体内のデータを参照したいと思います。

構造内のデータを参照する方法と、後でコード内でデータを使用する方法について助けを得ることができれば嬉しいです。 私は自分の質問が抽象的だと知っていますが、私はperlで構造体を作成/使用する方法を理解することができません。

構造の基本的な理解のために、以下のリンクを使用しました。 http://perldoc.perl.org/Class/Struct.html

********編集*********私は適切にコードの私のラインを指定することを

申し訳ありません。再書き込みそれらをここに:私は上記のような構造を作成したい

struct(1 => { 
    name => "A", # want to iterate over the @names array to assign the values 
    var => "var1", # similarly will iterate over the @var array for each struct 
    count => "c1", #similar for this one as above 
}); 

my @keys = ("1","2","3","4"}; 
my @names = ("A","B","C","D"); 
my @var = ("var1","var2","var3","var4"); 
my @count = ("c1","c2","c3","c4"); 

また、私は以下のような構造を指定します。私はこれがこのような構造を作る正しい方法であるかどうかを知りたい。後でこのような構造体の配列がある場合、構造体名と参照名(name、var、countなど)を使用して、その構造体のデータにアクセスしたいと考えています。

私はその明確な希望を持っています。ありがとうございました。

答えて

1

あなたが達成したいことはちょっと変わっていません。 {1,2,3,4}はPerlでハッシュリファレンスを作成し、配列に割り当てるには丸括弧を使用することに注意してください。

データ構造を構築するためにClass :: Structは必要ありません。配列とハッシュは言語の一部です(perldataを参照)。

は、私は、出力構造がどうあるべきか、ハードを推測しなければならなかったが、以下は、似たような生成します。

#!/usr/bin/perl 
use warnings; 
use strict; 

my @keys = (1, 2, 3, 4); 
my @names = qw(A B C D); 
my @var = qw(var1 var2 var3 var4); 
my @count = ('c1', 'c2', 'c3', 'c4'); 

my %struct; 
$struct{ shift @keys } = [ shift @names, shift @var, shift @count ] 
    while @keys; 

use Data::Dumper; print Dumper \%struct; 

出力:

$VAR1 = { 
      '4' => [ 
        'D', 
        'var4', 
        'c4' 
       ], 
      '1' => [ 
        'A', 
        'var1', 
        'c1' 
       ], 
      '2' => [ 
        'B', 
        'var2', 
        'c2' 
       ], 
      '3' => [ 
        'C', 
        'var3', 
        'c3' 
       ] 
     }; 
+0

返信いただきありがとうございます。私はハッシュを作成する方法を知っていますし、後でハッシュのキーと値を使用して必要なときにデータを使用します。しかし、私は構造体を使って同じことをする方法を調べたかったのです。だから、私は配列を構造体に変換し、配列をハッシュに変換する方法を知りたがっていました。 –

+0

'$ struct {shift @keys} ='を 'struct 'の前に' struct '(shift @keys =>'を付け加えて ')を置き換えてください。 – shawnhcorey

0

よりもむしろCのような構造体を使用して、あなた」をdハッシュを使用する。他の言語はそれを辞書と呼びます。それはペアの順序付けられていないリストです。

my %thing = (
    key => 1, 
    name => 'A', 
    var => 'var1', 
    count => 'c1' 
); 

次に、たとえば$thing{name}と表示されます。

リストからハッシュに変換するには、各リストの同じ要素を使用してハッシュのフィールドに値を設定します。

my %thing = (
    key => $keys[0], 
    name => $names[0], 
    var => $vars[0], 
    count => $count[0] 
); 

自分のキーで物事を取り出せます。そのためには、物事を含む別のハッシュが必要です。ハッシュには、キーと値のペアが含まれています。キーは$thing{key}で、値は%thingへの参照です。

$things{ $thing{key} } = \%thing; 

最初のものを元に戻したい場合は、そのキーを使用してハッシュリファレンスとして戻します。

my $thing = $things{1}; 
print $thing->{name}; 

すべての値に対して行うには、アイテムの数をカウントするループに入れます。各列の値から%thingを作成します。それを%thingsハッシュに追加します。

# This is declared outside the loop so it can be seen 
# both inside and outside the loop. 
my %things; 

for my $idx (0..$#keys) { 
    # This is declared inside the loop because we're only using 
    # the variable in the loop, but the data lives on in %things. 
    my %thing = (
     key => $keys[$idx], 
     name => $names[$idx], 
     var => $vars[$idx], 
     count => $count[$idx] 
    ); 

    $things{ $thing{name} } = \%things; 
} 

my $thing_one = $things{1}; 
print $thing_one->{name}; 
+0

返事をありがとう。私はハッシュを作成する方法を知っていますし、後でハッシュのキーと値を使用して必要なときにデータを使用します。しかし、私は構造体を使って同じことをする方法を調べたかったのです。だから、私は配列を構造体に変換し、配列をハッシュに変換する方法を知りたがっていました。 –

+0

@ V.Tej Perlには構造体がありません。C言語に落とされ、すばやく混乱しない限り(http://perldoc.perl.org/perlxstut.html)、[Inline :: C](https: //metacpan.org/pod/Inline::C)。あるいは、あなたは 'vec'とバイト配列と一緒に何かを混乱させることができます。 [Class :: Struct](http://metacpan.org/pod/Class::Struct)は構造体を使用せず、ハッシュや配列を使用します。これは本当に古くて奇妙なことであり、避けてください(Perlに同梱されている多くのモジュールはそうです)。代わりに[Moo](https://metacpan.org/pod/Moo)や[Class :: Tiny](https://metacpan.org/pod/Class::Tiny)のようなオブジェクトフレームワークを調べてください。 – Schwern

+0

助けてくれてありがとう。私はそれを調べます。 –

関連する問題