- ベストアンサー
splitでほしいものが消えてしまう・・・
文章列を1行取ってきて、そのなかから(1)《←全部全角です》をとってきたいとおもい、プログラムを書いたのですが、(1)だけ消えてしまいます。逆にこれだけを残すことはできないのでしょうか? 今までCでポインタでやってたんですけど、今回Perlを使うことになり、悪戦苦闘しています。 よろしくお願いします。 ↓のように書きました。コードはSJISです。 @list = split(/\((?:\x82[\x4F-\x58])\)/ ,$hows[$j]);
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
したいことがもうひとつわからないので、勘違いしているかもしれませんが @list = ($hows[$j]=~ /\((?:\x82[\x4F-\x58])\)/g); でいいような気がします。
その他の回答 (3)
全角のカッコを\でエスケープする必要はないと思います。また、全角の0から9の指定は[0-9]でもできます (漢数字の〇から九は[〇-九]ではだめですけど)。 @list = split /([0-9])/, $hows[$j]; これだとセパレータの「(1ケタの全角数字)」はもちろんlistの要素になりませんが、 No.2の方が書かれたようにセパレータの一部をカッコで囲むと、その部分も要素になります。 @list = split /(([0-9]))/, $hows[$j]; もし、セパレータ?というかパターンを要素にしたい場合は、No.3の方が書かれたように @list = $hows[$j] =~ /([0-9])/g; 「(1ケタの全角数字)」を削除するのであれば、s///gでもいいのではないかと思います。 $hows[$j] =~ s/([0-9])//g; splitは3つ目の引数として、-1 (負数)を指定しないと、後ろにある空の要素を捨ててしまうので、それでlistの要素数が減って、プログラムの別のところで問題が起こっているのかもしれません。 @list = split /([0-9])/, $hows[$j], -1;
お礼
Windowsでやってるせいかわかりませんが、普通に全角で[0-9]と指定してもできなかったので、SJISコード表示を上記のようにしていたのです。原因はよくわからないんですけど(^^; いろいろな手法を教えていただいてありがとうございます!
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
splitは、パターンで指定したモノがデリミタ(分割する記号)だとするので、デリミタ自体はリストに含まれません。 デリミタも結果としてのリストに含める場合には パターンを()で囲むことでリストに含めることができます。 つまり @list = split(/(\((?:\x82[\x4F-\x58])\))/ ,$hows[$j]); とします。 単に、パターンにマッチするものを取り出すのだったら、splitを使うのがおかしい様な気がします。
- sunasearch
- ベストアンサー率35% (632/1788)
(@listの要素数-1)個の(1)があると考えて、 リストを作ってはどうでしょうか? スマートではないのかも。
お礼
説明不足ですみません。 やりたいことは、つまりは文章の中で、何回「(全角数字)」という表記が出てきるのか、括弧の中の数字はどんなものが使われているのかと調べたいのです。 で、$hows[$j]にその文章を入れ込んであるので、そのなかから「(全角数字)」を切り出して、@listに格納したかったのです。 上記の方法でうまくいきました!とりだしたいときはこうかけばよいのですね…ありがとうございました!!