「Perl2次元配列」の版間の差分
ナビゲーションに移動
検索に移動
imported>Webmaster |
imported>Webmaster |
||
(同じ利用者による、間の1版が非表示) | |||
16行目: | 16行目: | ||
== 配列への代入方法 == | == 配列への代入方法 == | ||
ひとつ、ひとつブラケット <code>[</code>で括ってやって指定する方法<br /> | ひとつ、ひとつブラケット <code>[</code>で括ってやって指定する方法<br /> | ||
− | |||
<syntaxhighlight lang="perl"> | <syntaxhighlight lang="perl"> | ||
my @jdata; | my @jdata; | ||
32行目: | 31行目: | ||
foreach my $var1 (@jdata) { | foreach my $var1 (@jdata) { | ||
+ | foreach my $var2 (@{$var1}) { | ||
+ | print "$var2 "; | ||
+ | } | ||
+ | print "\n"; | ||
+ | } | ||
+ | </syntaxhighlight><br /> | ||
+ | <br /> | ||
+ | <code>Push</code>を使ってまとめて指定する方法もあります<br /> | ||
+ | ここで注意しないといけないのは配列をリファレンスにしないといけないことです<br /> | ||
+ | <code>push(@spec, \@chars);</code>の<code>\@chars</code>で\がついているところが重要です<br /> | ||
+ | <syntaxhighlight lang="perl"> | ||
+ | my @spec = (); | ||
+ | my @chars = qw/あ い う え お/; | ||
+ | push(@spec, \@chars); | ||
+ | |||
+ | my @chars = qw/か き こ け こ/; | ||
+ | push(@spec, \@chars); | ||
+ | foreach my $var1 (@jdata) { | ||
+ | foreach my $var2 (@{$var1}) { | ||
+ | print "$var2 "; | ||
+ | } | ||
+ | print "\n"; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | == 2次元配列の表示 == | ||
+ | 配列の表示方法も2種類あるので意味を理解して使いましょう | ||
+ | <syntaxhighlight lang="perl"> | ||
+ | foreach my $var1 (@spec){ | ||
+ | foreach my $var2 (@$var1){ | ||
+ | print "$var2 "; | ||
+ | } | ||
+ | print "\n"; | ||
+ | } | ||
+ | |||
+ | foreach my $var1 (@spec) { | ||
foreach my $var2 (@{$var1}) { | foreach my $var2 (@{$var1}) { | ||
print "$var2 "; | print "$var2 "; | ||
38行目: | 72行目: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | == csvデータの二次元配列への読み込み == | ||
+ | サンプルプログラムです<br> | ||
+ | <syntaxhighlight lang="perl"> | ||
+ | #-------------------------------------------------------------------------------------------- | ||
+ | #モジュールの宣言 | ||
+ | # | ||
+ | #厳密な構文チェックと警告表示するモジュール | ||
+ | use strict; | ||
+ | use warnings; | ||
+ | |||
+ | #-------------------------------------------------------------------------------------------- | ||
+ | #なんちゃって個人情報を二次元配列に代入する | ||
+ | #データは、最下部の__DATA__に記載。追加変更があれば | ||
+ | #この部分(__DATA__)を変更すること | ||
+ | #-------------------------------------------------------------------------------------------- | ||
+ | #配列の宣言 | ||
+ | my @Address_Data; | ||
+ | |||
+ | #__DATA__以降に入っているCSVデータの読み込み | ||
+ | while(my $line = <DATA>) { | ||
+ | |||
+ | #改行を削除する | ||
+ | chomp($line); | ||
+ | |||
+ | #一時的に行のデータを分解するための配列 | ||
+ | my @data; | ||
+ | |||
+ | #カンマで分解して配列(@data)へ代入する | ||
+ | @data = split(/,/, $line); | ||
+ | |||
+ | # @Address_Dataという配列に、配列(@data)をpushする。このとき、配列(@data)は「\@」でリファレンスとして保存 | ||
+ | push @Address_Data, \@data; | ||
+ | } | ||
+ | #この段階で | ||
+ | # | ||
+ | #@Address_Dataに二次元配列で__DATA__以降が保存されている | ||
+ | # | ||
+ | #-------------------------------------------------------------------------------------------- | ||
+ | #配列への参照方法 | ||
+ | # | ||
+ | #配列の最後の要素番号を取得して+1することで | ||
+ | #二次元配列の行数が取得できる | ||
+ | print $#Address_Data+1 ."\n"; | ||
+ | |||
+ | #スカラー変数に代入する場合は以下の方法 | ||
+ | my $length=@Address_Data; | ||
+ | print $length."\n"; | ||
+ | |||
+ | #二次元配列における要素数のはじき出し | ||
+ | #二次元配列の列数が取得できる | ||
+ | my $Row = @{$Address_Data[1]}; | ||
+ | print $Row."\n"; | ||
+ | |||
+ | #要素への直接のアクセス | ||
+ | print ${$Address_Data[0]}[0], "\n"; | ||
+ | |||
+ | #全データ書き出し | ||
+ | #分かりやすく、要素を1つずつ書き出し | ||
+ | for my $x(0..@Address_Data-1){ | ||
+ | for my $y(0..@{$Address_Data[$x]}-1){ | ||
+ | #要素への直接のアクセス | ||
+ | print "$x - $y : ".${$Address_Data[$x]}[$y], "\n"; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | #-------------------------------------------------------------------------------------------- | ||
+ | #なんちゃって個人情報より作成 | ||
+ | #http://kazina.com/dummy/index.html | ||
+ | #-------------------------------------------------------------------------------------------- | ||
+ | |||
+ | |||
+ | #名前,ふりがな,アドレス,性別,年齢,誕生日,婚姻,血液型,都道府県,携帯,キャリア | ||
+ | __DATA__ | ||
+ | 板橋 瑠璃亜,いたばし るりあ,itabashi_ruria@example.com,女,33,1984/5/18,未婚,O型,鹿児島県,080-1951-9945,ドコモ | ||
+ | 中西 彩華,なかにし あやか,nakanishi_ayaka@example.com,女,32,1985/6/28,既婚,B型,東京都,090-4022-3980,ドコモ | ||
+ | 古山 努,ふるやま つとむ,furuyama_tsutomu@example.com,男,31,1986/4/28,既婚,B型,東京都,090-2597-7188,ドコモ | ||
+ | 芹沢 だん吉,せりざわ だんきち,serizawa_dankichi@example.com,男,34,1983/8/2,未婚,A型,愛媛県,090-6334-2620,ソフトバンク | ||
+ | 神崎 秀隆,かんざき ひでたか,kannzaki_hidetaka@example.com,男,30,1987/5/16,既婚,O型,福島県,090-1551-8414,au | ||
+ | 吉永 淳,よしなが あつし,yoshinaga_atsushi@example.com,男,30,1986/11/10,未婚,A型,広島県,080-7699-6734,au | ||
+ | 小木 あさみ,おぎ あさみ,ogi_asami@example.com,女,31,1986/9/20,既婚,A型,静岡県,090-5390-2799,ドコモ | ||
+ | 原田 祐一,はらだ ゆういち,harada_yuuichi@example.com,男,33,1984/6/19,既婚,A型,群馬県,080-7219-8509,ドコモ | ||
+ | 高原 季衣,たかはら としえ,takahara_toshie@example.com,女,30,1987/4/17,既婚,O型,東京都,090-3901-4473,ドコモ | ||
+ | 熊倉 涼子,くまくら りょうこ,kumakura_ryouko@example.com,女,35,1982/8/10,既婚,A型,青森県,090-9236-7050,ドコモ | ||
+ | 梅田 美嘉,うめだ みか,umeda_mika@example.com,女,31,1986/9/24,既婚,A型,宮城県,090-3325-2231,ドコモ | ||
+ | 安永 輝信,やすなが あきのぶ,yasunaga_akinobu@example.com,男,33,1984/5/30,既婚,A型,埼玉県,090-7148-6889,ドコモ | ||
+ | 那須 遥,なす はるか,nasu_haruka@example.com,女,33,1983/11/14,既婚,A型,神奈川県,080-5267-6138,au | ||
+ | 金谷 景子,かなや けいこ,kanaya_keiko@example.com,女,34,1983/10/6,既婚,O型,福井県,080- 794-6571,ドコモ | ||
+ | 辻 兼,つじ けん,tsuji_ken@example.com,男,32,1985/9/30,未婚,A型,青森県,090-5976-2186,au | ||
+ | 波多野 賢治,はたの けんじ,hatano_kenji@example.com,男,33,1984/6/19,未婚,A型,和歌山県,080-7554-8348,ドコモ | ||
+ | 木下 なつみ,きのした なつみ,kinoshita_natsumi@example.com,女,34,1983/9/1,既婚,O型,東京都,080-2454-9589,ソフトバンク | ||
+ | 黒沢 花緑,くろさわ かろく,kurosawa_karoku@example.com,男,33,1984/8/30,未婚,O型,青森県,090-2024-7030,ドコモ | ||
+ | 浅見 信輔,あさみ しんすけ,asami_shinsuke@example.com,男,35,1982/10/23,既婚,A型,岩手県,080-2018-8390,au | ||
+ | 石原 佳乃,いしはら よしの,ishihara_yoshino@example.com,女,35,1982/6/7,既婚,A型,福岡県,080-7255-7706,ドコモ | ||
+ | </syntaxhighlight><br /> | ||
+ | |||
---- | ---- | ||
<!-- カテゴリに追加するページ名を記入 --> | <!-- カテゴリに追加するページ名を記入 --> | ||
[[Category:Perl|にじげんはいれつ]] | [[Category:Perl|にじげんはいれつ]] |
2017年11月5日 (日) 11:43時点における最新版
もう少し2次元配列について詳しく記録しておく
2次元配列のイメージはこんな感じだとおもう
\ | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
0 | あ | い | う | え | お |
1 | か | き | く | け | こ |
2 | さ | し | す | せ | そ |
3 | た | ち | つ | て | と |
単純な50音表、こんな形が2次元配列というイメージがあると思う
配列への代入方法
ひとつ、ひとつブラケット [
で括ってやって指定する方法
my @jdata;
$jdata[0][0] = "あ";
$jdata[0][1] = "い";
$jdata[0][2] = "う";
$jdata[0][3] = "え";
$jdata[0][4] = "お";
$jdata[1][0] = "か";
$jdata[1][1] = "き";
$jdata[1][2] = "く";
$jdata[1][3] = "け";
$jdata[1][4] = "こ";
foreach my $var1 (@jdata) {
foreach my $var2 (@{$var1}) {
print "$var2 ";
}
print "\n";
}
Push
を使ってまとめて指定する方法もあります
ここで注意しないといけないのは配列をリファレンスにしないといけないことです
push(@spec, \@chars);
の\@chars
で\がついているところが重要です
my @spec = ();
my @chars = qw/あ い う え お/;
push(@spec, \@chars);
my @chars = qw/か き こ け こ/;
push(@spec, \@chars);
foreach my $var1 (@jdata) {
foreach my $var2 (@{$var1}) {
print "$var2 ";
}
print "\n";
}
2次元配列の表示
配列の表示方法も2種類あるので意味を理解して使いましょう
foreach my $var1 (@spec){
foreach my $var2 (@$var1){
print "$var2 ";
}
print "\n";
}
foreach my $var1 (@spec) {
foreach my $var2 (@{$var1}) {
print "$var2 ";
}
print "\n";
}
csvデータの二次元配列への読み込み
サンプルプログラムです
#--------------------------------------------------------------------------------------------
#モジュールの宣言
#
#厳密な構文チェックと警告表示するモジュール
use strict;
use warnings;
#--------------------------------------------------------------------------------------------
#なんちゃって個人情報を二次元配列に代入する
#データは、最下部の__DATA__に記載。追加変更があれば
#この部分(__DATA__)を変更すること
#--------------------------------------------------------------------------------------------
#配列の宣言
my @Address_Data;
#__DATA__以降に入っているCSVデータの読み込み
while(my $line = <DATA>) {
#改行を削除する
chomp($line);
#一時的に行のデータを分解するための配列
my @data;
#カンマで分解して配列(@data)へ代入する
@data = split(/,/, $line);
# @Address_Dataという配列に、配列(@data)をpushする。このとき、配列(@data)は「\@」でリファレンスとして保存
push @Address_Data, \@data;
}
#この段階で
#
#@Address_Dataに二次元配列で__DATA__以降が保存されている
#
#--------------------------------------------------------------------------------------------
#配列への参照方法
#
#配列の最後の要素番号を取得して+1することで
#二次元配列の行数が取得できる
print $#Address_Data+1 ."\n";
#スカラー変数に代入する場合は以下の方法
my $length=@Address_Data;
print $length."\n";
#二次元配列における要素数のはじき出し
#二次元配列の列数が取得できる
my $Row = @{$Address_Data[1]};
print $Row."\n";
#要素への直接のアクセス
print ${$Address_Data[0]}[0], "\n";
#全データ書き出し
#分かりやすく、要素を1つずつ書き出し
for my $x(0..@Address_Data-1){
for my $y(0..@{$Address_Data[$x]}-1){
#要素への直接のアクセス
print "$x - $y : ".${$Address_Data[$x]}[$y], "\n";
}
}
#--------------------------------------------------------------------------------------------
#なんちゃって個人情報より作成
#http://kazina.com/dummy/index.html
#--------------------------------------------------------------------------------------------
#名前,ふりがな,アドレス,性別,年齢,誕生日,婚姻,血液型,都道府県,携帯,キャリア
__DATA__
板橋 瑠璃亜,いたばし るりあ,itabashi_ruria@example.com,女,33,1984/5/18,未婚,O型,鹿児島県,080-1951-9945,ドコモ
中西 彩華,なかにし あやか,nakanishi_ayaka@example.com,女,32,1985/6/28,既婚,B型,東京都,090-4022-3980,ドコモ
古山 努,ふるやま つとむ,furuyama_tsutomu@example.com,男,31,1986/4/28,既婚,B型,東京都,090-2597-7188,ドコモ
芹沢 だん吉,せりざわ だんきち,serizawa_dankichi@example.com,男,34,1983/8/2,未婚,A型,愛媛県,090-6334-2620,ソフトバンク
神崎 秀隆,かんざき ひでたか,kannzaki_hidetaka@example.com,男,30,1987/5/16,既婚,O型,福島県,090-1551-8414,au
吉永 淳,よしなが あつし,yoshinaga_atsushi@example.com,男,30,1986/11/10,未婚,A型,広島県,080-7699-6734,au
小木 あさみ,おぎ あさみ,ogi_asami@example.com,女,31,1986/9/20,既婚,A型,静岡県,090-5390-2799,ドコモ
原田 祐一,はらだ ゆういち,harada_yuuichi@example.com,男,33,1984/6/19,既婚,A型,群馬県,080-7219-8509,ドコモ
高原 季衣,たかはら としえ,takahara_toshie@example.com,女,30,1987/4/17,既婚,O型,東京都,090-3901-4473,ドコモ
熊倉 涼子,くまくら りょうこ,kumakura_ryouko@example.com,女,35,1982/8/10,既婚,A型,青森県,090-9236-7050,ドコモ
梅田 美嘉,うめだ みか,umeda_mika@example.com,女,31,1986/9/24,既婚,A型,宮城県,090-3325-2231,ドコモ
安永 輝信,やすなが あきのぶ,yasunaga_akinobu@example.com,男,33,1984/5/30,既婚,A型,埼玉県,090-7148-6889,ドコモ
那須 遥,なす はるか,nasu_haruka@example.com,女,33,1983/11/14,既婚,A型,神奈川県,080-5267-6138,au
金谷 景子,かなや けいこ,kanaya_keiko@example.com,女,34,1983/10/6,既婚,O型,福井県,080- 794-6571,ドコモ
辻 兼,つじ けん,tsuji_ken@example.com,男,32,1985/9/30,未婚,A型,青森県,090-5976-2186,au
波多野 賢治,はたの けんじ,hatano_kenji@example.com,男,33,1984/6/19,未婚,A型,和歌山県,080-7554-8348,ドコモ
木下 なつみ,きのした なつみ,kinoshita_natsumi@example.com,女,34,1983/9/1,既婚,O型,東京都,080-2454-9589,ソフトバンク
黒沢 花緑,くろさわ かろく,kurosawa_karoku@example.com,男,33,1984/8/30,未婚,O型,青森県,090-2024-7030,ドコモ
浅見 信輔,あさみ しんすけ,asami_shinsuke@example.com,男,35,1982/10/23,既婚,A型,岩手県,080-2018-8390,au
石原 佳乃,いしはら よしの,ishihara_yoshino@example.com,女,35,1982/6/7,既婚,A型,福岡県,080-7255-7706,ドコモ