Tie::String
30分プログラム、その71。
Perlだと、文字列はスカラーなので配列のようにアクセスできない。
my $msg = 'Hello,world!!'; print substr($msg,0,1); # <- 0番目の要素を取得 print $msg[0]; # <- これがやりたい
というわけで、これをタイ変数で実現してみる。
tie my @string,'StringArray','ABCD'; print "$string[0]\n";
use strict; use warnings; package StringArray; use base 'Tie::Array'; # 初期化 sub TIEARRAY{ my ($class,$string) = @_; bless \$string,$class; } # 文字の取得 sub FETCH{ my ($string,$index) = @_; substr($$string,$index,1); } # 文字列への代入 sub STORE{ my ($string,$index,$value) = @_; $$string = substr($$string,0,$index) . $value . substr($$string,$index+1) } # 文字列の長さ sub FETCHSIZE{ my ($string) = @_; length $$string; } # 文字の長さの変更 sub STORESIZE{ my ($string,$count) = @_; if(length($$string) > $count){ # 短くする $$string = substr($$string,0,$count); }else{ # 長くする $$string .= ' ' x ($count - length($$string)); } } # 存在チェック sub EXISTS{ my ($string,$index) = @_; $index < length($$string); } package Main; tie my @string,'StringArray','ABCD'; print "$string[0]\n"; print "$string[1]\n"; print "$string[2]\n"; $string[0] = 'a'; $string[-1] = 'd'; $#string = 10; print "@string\n"; print scalar(@string) . "\n"; print exists $string[1];