Perlの謎(その5):構造体がないデータ構造
普通の言語、たとえば、C言語とかVB等では、データ構造を定義できる構造体があります。
もっと昔だと、構造体がなく、すべて配列で処理する言語もありました(昔のコボルとかベーシック)。
で、perlのデータ構造なのですが、ご存知の通り、スカラー、配列、ハッシュの3種類しかありません。
そう、構造体がないのです。
では、他言語で構造体処理のクセを身に付けてしまった人は、どうすればよいのでしょうか・・・。
実は、構造体は、ハッシュで表現ができるのです。
構造体の配列も、同じく、ハッシュの配列で表現ができるのです。
以下にC言語の構造体とPerlのハッシュ、そして、構造体配列とハッシュの配列のサンプルを書いてみました。
たしかに、C言語の構造体は、Perlのハッシュで表現ができていますね!
◆サンプル:C言語の構造体
struct db_login { char svnm[7]; char svnm2[9]; char loginid[31]; char password[31]; char db_string[45]; }; struct db_login shisha={"svr00X", "X支社", "id", "passwd", "svr00Xs"]; printf("hostname=%s\n", &shisha.svnm[0]); printf("hostname2=%s\n", &shisha.svnm2[0]); printf("loginid=%s\n", &shisha.loginid[0]); printf("password=%s\n", &shisha.password[0]); printf("db_string=%s\n", &shisha.db_string[0]);
◆サンプル:Perlのハッシュ
my %shisha = ( svnm => 'svr00X', svnm2 => 'X支社', loginid => 'id', password => 'passwd', db_string => 'svr00Xs' ); printf("hostname=%s\n", $shisha{svnm}); printf("hostname2=%s\n", $shisha{svnm2}); printf("loginid=%s\n", $shisha{loginid}); printf("password=%s\n", $shisha{password}); printf("db_string=%s\n", $shisha{db_string});
◆サンプル:C言語の構造体配列
#define SHISHA_CNT 3 struct db_login { char svnm[7]; char svnm2[9]; char loginid[31]; char password[31]; char db_string[45]; }; struct db_login shishas[SHISHA_CNT]={ "svr001", "A支社", "id", "passwd", "svr001s", "svr002", "B支社", "id", "passwd", "svr002s", "svr003", "C支社", "id", "passwd", "svr003s", }; int i; for (i =0; i < SHISHA_CNT; i++) { printf("hostname=%s\n", &shisha[i].svnm[0]); printf("hostname2=%s\n", &shisha[i].svnm2[0]); printf("loginid=%s\n", &shisha[i].loginid[0]); printf("password=%s\n", &shisha[i].password[0]); printf("db_string=%s\n", &shisha[i].db_string[0]); }
◆Perlのハッシュの配列
my @shisha = ({ svnm => 'svr001', svnm2 => 'A支社', loginid => 'id', password => 'passwd', db_string => 'svr001s' }, { svnm => 'svr002', svnm2 => 'B支社', loginid => 'id', password => 'passwd', db_string => 'svr002s' }, { svnm => 'svr003', svnm3 => 'C支社', loginid => 'id', password => 'passwd', db_string => 'svr003s' }, ); for (my $i = 0; $i < @shisha; $i++) { printf("hostname=%s\n", $shisha[$i]{svnm}); printf("hostname2=%s\n", $shisha[$i]{svnm2}); printf("loginid=%s\n", $shisha[$i]{loginid}); printf("password=%s\n", $shisha[$i]{password}); printf("db_string=%s\n", $shisha[$i]{db_string}); }
Perlでは、リファレンスと無名配列と無名ハッシュが理解できると、データ構造は自由自在なのです!
たとえば