ヒットした数を取得する(復習)

ずーっと昔に詳説 正規表現 第2版で読んだような覚えがあるんだけど念のために実地で調べた結果。こんな基礎的なことを忘れるようではもう駄目かも。
ある文字列$sampleの中に、それよりも短い文字列$wordが何回含まれているかを調べる。

my @hit = $sample =~ /$word/g;

こうすると、@hitの各要素は先頭からヒットした内容になる。ヒットした回数は@hitの長さを調べればよい。(scalarを使って明示的に調べるのが俺の趣味。)

my $count = scalar @hit;

置換ないし削除しながらヒット数を調べるには、

my $hit = $sample =~ s/$word//g;

$hitがそのまま置換した回数になる。

Class-DBIであるカラムに設定する値を自動処理する方法

なんとなく、Class-DBIのテキスト自体が不親切のようなので。ある値がvalidかどうかの処理の仕方はあるが、validな物に変換する方法は直感的にはわかりづらい。
たとえば、日付を必要とするカラムに対して、西暦で入れても和暦で入れても最終的には西暦に変換してから設定したい場合など。
結論から言えば、add_constraintを使う。

__PACKAGE__->add_constraint(
	collumn_check=>column_name=>\&for_before_set_column
);
# 第一引数は実際には、他の制約とかぶらなければなんでもよい。
# 第二引数は制約を設定するカラム名。
# 第三引数はサブルーチンのリファレンス。
sub for_before_set_column {
	# 入力された値、レコードのオブジェクト、カラム名、現在の値を取得
	my ($value, $self, $column_name, $changing) = @_;
	# $changingはハッシュリファレンスで、このオブジェクトの現在の値が入っている。
	# ここで$valueに対して、必要な加工をする。
	# 必要なら$changingに収められた他のカラムを参照しつつ処理する。
	$changing->{$column_name} = $value; # $changingの$column_nameに$valueを設定する。
	return 1; # 明示的に正を返すのが吉。
}

Class-DBIで連鎖的にカラムを設定する方法

あるカラムに値を設定した場合、他のカラムがそれに追随して自動的に変更される方法。
結論から言えば、add_triggerを使う。

# columnの部分にカラム名が入る。
__PACKAGE__->add_trigger(
	after_set_column=>\&for_after_set_column
);
sub for_after_set_column {
	my $self = shift;
	my $value = $self->get('column');
	# 値を加工する。
	$self->another_column($value); # 他のカラムに加工した値を設定する。
}

私はこれを、ISBNを設定すれば、自動的にEANやISBNの国籍コード、出版者コード等が埋まるように使った。

ヒットした数を取得する(復習)

ずーっと昔に詳説 正規表現 第2版で読んだような覚えがあるんだけど念のために実地で調べた結果。こんな基礎的なことを忘れるようではもう駄目かも。
ある文字列$sampleの中に、それよりも短い文字列$wordが何回含まれているかを調べる。

my @hit = $sample =~ /$word/g;

こうすると、@hitの各要素は先頭からヒットした内容になる。ヒットした回数は@hitの長さを調べればよい。(scalarを使って明示的に調べるのが俺の趣味。)

my $count = scalar @hit;

置換ないし削除しながらヒット数を調べるには、

my $hit = $sample =~ s/$word//g;

$hitがそのまま置換した回数になる。

Class-DBIであるカラムに設定する値を自動処理する方法

なんとなく、Class-DBIのテキスト自体が不親切のようなので。ある値がvalidかどうかの処理の仕方はあるが、validな物に変換する方法は直感的にはわかりづらい。
たとえば、日付を必要とするカラムに対して、西暦で入れても和暦で入れても最終的には西暦に変換してから設定したい場合など。
結論から言えば、add_constraintを使う。

__PACKAGE__->add_constraint(
	collumn_check=>column_name=>\&for_before_set_column
);
# 第一引数は実際には、他の制約とかぶらなければなんでもよい。
# 第二引数は制約を設定するカラム名。
# 第三引数はサブルーチンのリファレンス。
sub for_before_set_column {
	# 入力された値、レコードのオブジェクト、カラム名、現在の値を取得
	my ($value, $self, $column_name, $changing) = @_;
	# $changingはハッシュリファレンスで、このオブジェクトの現在の値が入っている。
	# ここで$valueに対して、必要な加工をする。
	# 必要なら$changingに収められた他のカラムを参照しつつ処理する。
	$changing->{$column_name} = $value; # $changingの$column_nameに$valueを設定する。
	return 1; # 明示的に正を返すのが吉。
}

Class-DBIで連鎖的にカラムを設定する方法

あるカラムに値を設定した場合、他のカラムがそれに追随して自動的に変更される方法。
結論から言えば、add_triggerを使う。

# columnの部分にカラム名が入る。
__PACKAGE__->add_trigger(
	after_set_column=>\&for_after_set_column
);
sub for_after_set_column {
	my $self = shift;
	my $value = $self->get('column');
	# 値を加工する。
	$self->another_column($value); # 他のカラムに加工した値を設定する。
}

私はこれを、ISBNを設定すれば、自動的にEANやISBNの国籍コード、出版者コード等が埋まるように使った。

ヒットした数を取得する(復習)

ずーっと昔に詳説 正規表現 第2版で読んだような覚えがあるんだけど念のために実地で調べた結果。こんな基礎的なことを忘れるようではもう駄目かも。
ある文字列$sampleの中に、それよりも短い文字列$wordが何回含まれているかを調べる。

my @hit = $sample =~ /$word/g;

こうすると、@hitの各要素は先頭からヒットした内容になる。ヒットした回数は@hitの長さを調べればよい。(scalarを使って明示的に調べるのが俺の趣味。)

my $count = scalar @hit;

置換ないし削除しながらヒット数を調べるには、

my $hit = $sample =~ s/$word//g;

$hitがそのまま置換した回数になる。

Class-DBIであるカラムに設定する値を自動処理する方法

なんとなく、Class-DBIのテキスト自体が不親切のようなので。ある値がvalidかどうかの処理の仕方はあるが、validな物に変換する方法は直感的にはわかりづらい。
たとえば、日付を必要とするカラムに対して、西暦で入れても和暦で入れても最終的には西暦に変換してから設定したい場合など。
結論から言えば、add_constraintを使う。

__PACKAGE__->add_constraint(
	collumn_check=>column_name=>\&for_before_set_column
);
# 第一引数は実際には、他の制約とかぶらなければなんでもよい。
# 第二引数は制約を設定するカラム名。
# 第三引数はサブルーチンのリファレンス。
sub for_before_set_column {
	# 入力された値、レコードのオブジェクト、カラム名、現在の値を取得
	my ($value, $self, $column_name, $changing) = @_;
	# $changingはハッシュリファレンスで、このオブジェクトの現在の値が入っている。
	# ここで$valueに対して、必要な加工をする。
	# 必要なら$changingに収められた他のカラムを参照しつつ処理する。
	$changing->{$column_name} = $value; # $changingの$column_nameに$valueを設定する。
	return 1; # 明示的に正を返すのが吉。
}

Class-DBIで連鎖的にカラムを設定する方法

あるカラムに値を設定した場合、他のカラムがそれに追随して自動的に変更される方法。
結論から言えば、add_triggerを使う。

# columnの部分にカラム名が入る。
__PACKAGE__->add_trigger(
	after_set_column=>\&for_after_set_column
);
sub for_after_set_column {
	my $self = shift;
	my $value = $self->get('column');
	# 値を加工する。
	$self->another_column($value); # 他のカラムに加工した値を設定する。
}

私はこれを、ISBNを設定すれば、自動的にEANやISBNの国籍コード、出版者コード等が埋まるように使った。