2バイト文字の途中でカットしたいのですが・・
[上に]
[前に]
[次に]
ポヨゾー
[E-Mail]
2000/05/26(金) 20:43:07
ふじさんの
> とりあえず、文字列の文字コードがEUCで $str に入っているとして、
>
> $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
> $threeBytes = '\x8F[\xA1-\xFE]{2}';
>
> @_ = ($str =~ /($twoBytes|$threeBytes|.)/osg);
>
> これで @_ に、一文字ごとに入るので、あとはそれを適当に・・・
../199906/99060039.htm
をやりたいのですが、「あとはそれを適当に・・・」で具体的にどうやるか検討がつきません。
初歩的質問でゴメンナサイ。
それと、この正規表現で使ってる「osg」という演算子はどういう意味なのでしょうか??
ふじ
2000/05/26(金) 23:19:41
最初にお断り。
上記のスクリプトは大崎氏のページ、
http://www.din.or.jp/~ohzaki/perl.htm#JP_Split
から拝借したものです。
>「あとはそれを適当に・・・」で具体的にどうやるか検討がつきません。
$_[0] に最初の一文字、
$_[1] に二文字目、
$_[2] に三文字目
…
というように分割されていますので、
「全角半角問わずともかく15文字」なら
$str = join("", @_[0..14]);
「文字列の長さが 15 byte 以内」なら
for(@_){
last if length($str . $_) > 15;
$str .= $_;
}
とかですか。
「osg」は演算子ではなくて、パターンマッチのオプションです。
$ perldoc perlop
(略)
Options are:
c Do not reset search position on a failed match when /g is in effect.
g Match globally, i.e., find all occurrences.
i Do case-insensitive pattern matching.
m Treat string as multiple lines.
o Compile pattern only once.
s Treat string as single line.
x Use extended regular expressions.
(略)
o は パターンを一回しかコンパイルしない
(変数でマッチさせるときに、変数の中身がパターンマッチの途中で変化しないときに
指定すると速度アップ)
g は、一度マッチしたら、マッチした後ろの文字列について繰り返し
パターンマッチを試みる。
s は、改行文字(\n)も . でマッチするようにする。
詳しくは、Perlの本を参照された方がよろしいかと。
ポヨゾー
2000/05/27(土) 01:10:02
[[解決]]
ふじさんどうもありがとうございました!
おかげで期待通りの動作ができました!!
大崎氏のページも大変参考になりました。
[上に]
[前に]
[次に]