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
[[解決]]
ふじさんどうもありがとうございました!
おかげで期待通りの動作ができました!!

大崎氏のページも大変参考になりました。

[上に] [前に] [次に]