「Perl2次元配列」の版間の差分

提供: dococo wiki
ナビゲーションに移動 検索に移動
imported>Webmaster
(ページの作成:「もう少し2次元配列について詳しく記録しておく<br /> 2次元配列のイメージはこんな感じだとおもう<br /> {| class="wikitable" |- !...」)
 
imported>Webmaster
 
(同じ利用者による、間の4版が非表示)
2行目: 2行目:
 
2次元配列のイメージはこんな感じだとおもう<br />
 
2次元配列のイメージはこんな感じだとおもう<br />
 
{| class="wikitable"
 
{| class="wikitable"
 +
|+2次元配列
 +
! \ !! 0 !! 1 !! 2 !! 3 !! 4
 
|-
 
|-
! 見出しテキスト !! 0 !! 1 !! 2 !! 3 !! 4
+
| 0 || あ || い || う || え || お
 
|-
 
|-
| 0 || セル内のテキスト || セル内のテキスト || セル内のテキスト || セル内のテキスト || セル内のテキスト
+
| 1 || || || || ||
 
|-
 
|-
| 1 || セル内のテキスト || セル内のテキスト || セル内のテキスト || セル内のテキスト || セル内のテキスト
+
| 2 || || || || ||
 
|-
 
|-
| 2 || セル内のテキスト || セル内のテキスト || セル内のテキスト || セル内のテキスト || セル内のテキスト
+
| 3 || || || || ||
|-
 
| 3 || セル内のテキスト || セル内のテキスト || セル内のテキスト || セル内のテキスト || セル内のテキスト
 
 
|}
 
|}
 +
単純な50音表、こんな形が2次元配列というイメージがあると思う<br />
 +
== 配列への代入方法 ==
 +
ひとつ、ひとつブラケット <code>[</code>で括ってやって指定する方法<br />
 +
<syntaxhighlight lang="perl">
 +
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";
 +
}
 +
</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}) {
 +
print "$var2 ";
 +
}
 +
print "\n";
 +
}
 +
</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次元配列のイメージはこんな感じだとおもう

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,ドコモ