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];