3つの列で構成されるcsvファイルから値を割り当てる配列があります
CSVファイル:
Name,Age,City
Joe,30,NYC
Mary,32,Washington
.
.
.
n number of lines
だから私はこれを私のperlスクリプトに渡し、これらの変数を割り当てます
($name,$age,$city) = split(",",$_,3);
push @array, "$name,$age,$city";
ただし、2つのハッシュにキーと値のペアがあり、この配列にプッシュしたいと思います。
これはハッシュです
%hash = ('NYC' => NYC, 'Washington' => Virginia, and so on)
%hash2 = ('NYC' => US, 'Washington' => US, 'London' => UK, and so on)
配列にStateとCountryの2つの列を追加して、次のようになります。
Name,Age,City,State,Country
Joe,30,NYC,NY,US
Mary,32,Washington,Virginia,US
.
.
.
n number of lines
switchステートメントで試しました
switch($city){
case "NYC" {$state = "NY"; $country = "US";
push @array, "$name,$age,$city,$state,$country";
}
}
しかし、それは機能しませんでした。
助けていただければ幸いです
まず、配列に配置するのは、すべて二重引用符で囲まれた単一の文字列です。これはあなたが意図したことかもしれませんが、私はこれを一度に1ステップずつ実行したいと思います。
push
あなただけ追加するすべての変数を一覧表示することができますので、その場合には何の引用は一切必要ありません、リストを取ります。「州」と「国」を追加するには、キーのハッシュから値を引き出すだけです。$city
push @array, $name, $age, $city, $hash{$city}, $hash2{$city};
しかし、この配列がさらにレコードを取得することを意図している場合、どのようにそれらを区別しますか?1つの方法は、毎回配列参照を追加することです。
push @array, [ $name, $age, $city, $hash{$city}, $hash2{$city} ];
ここで、中括弧[ ]
は匿名配列を作成し、それへの参照を返します。これはスカラーであるため、それ自体が配列要素になる可能性があります。$array[$index]->[0]
名前(または省略形$array[$index][0]
)のように、これにインデックスを付ける必要があるため、個々のアイテムの取得は適切ではありません。しかし、ほとんどの場合、それらすべてが必要な場合は、完璧です。my @data = @{ $array[$index] };
別の方法は、代わりに、{ }
たとえば次のようなを使用してハッシュ参照を追加することです。
push @array, { name => $name, age => $age, city => $city,
state => $hash{$city}, country => $hash2{$city} };
ここで、値を$array[$index]->{name}
(etc)として取得できます。これは、個々のコンポーネントの操作に明らかに適しています。
別の方法は、実際に各レコードに文字列を追加することです。次に、引用符で囲まれたハッシュ値を追加します
push @array, "$name,$age,$city,$hash{$city},$hash2{$city}";
ハッシュ値は二重引用符で囲まれた文字列内で評価できるためです。
いずれにせよ、スイッチをオンにする必要はありません。これが$city
まさにハッシュの目的であり、値をキーに関連付けて、そのキーの値を直接取得できるようにします。
追加したいのですが、これらのハッシュにもっと有益な方法で名前を付けるのはどうですか?
例えば
my %state = (NYC => 'NY', Washington => 'Virginia'); # ...
my %country = (NYC => 'US', Washington => 'US', London => 'UK'); # ...
そして、あなたははるかに明確になります
push @records, "$name,$age,$city,$state{$city},$country{$city}";
配列名も変更しました。
ネーミングに関する補足。ハッシュ名が単数(「states」ではなく「state」)である規則を使用しましたが、それは単一の名前付きアイテム$state{$city}
(state-for-city)を参照するという理論的根拠があります。適切に選択された変数名を使用すると、これが何を表すかは明らかです。ただし、これはいかなる種類の「ルール」でもありません。複数形も同様に使用されます(「状態」ではなく「状態」)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加