• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:splitが思うように動きません助けて下さい。)

Perl初心者がsplitで問題が発生しています。助けてください。

このQ&Aのポイント
  • Perl初心者がsplit関数を使用してプログラムを作成していますが、うまく動作しません。具体的には、文字列を明細と金額に分けて検索できるプログラムを作成していますが、一部の明細(コーヒー)に対してのみ正しい結果が得られません。
  • 不具合箇所を特定するため、splitの結果を表示してみましたが、コーヒーの部分だけが正しく分割されていないことがわかりました。問題の解決方法を知っている方にアドバイスをいただきたいです。
  • 期待する結果は、明細と金額が正しく分割されていること、特にコーヒーの部分が正しく取得されることです。Perl初心者のため具体的な解決策が分からないため、助けていただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

あなたには「コーヒー」と4文字に見えるだろうし、「ー」一文字を分割することなでできない、と思っているかもしれませんが (何も指定しなければ)Perlには 「コの1バイト目」「コの2バイト目」...「ーの1バイト目」「ーの2バイト目」... というように見えています。「ー」は複数の文字なので、途中で切ることもできます。 (文字コードによって、1文字が何バイトに相当するかが違います) split(/[、,]/, $moneyline); は、 「、」か「,」の2文字のどちらか ではなく 「、の1バイト目」か「、の2バイト目」か、..「,」のいずれか という意味になります。 なので、「、の1バイト目」と「ーの1バイト目」が同じなら、「ーの1バイト目」が区切り文字となり、次の項目が 「ーの2バイト目」から始まることになります。 ★[ヒ=. という結果から考えて、Shift_JISで書いてないでしょうか? そうだとして、文字コードを調べると ー は 0x81 0x5b 、 は 0x81 0x41 と、1バイト目が一致します。 0x5b だけだと、 [ という文字なので、実行結果とも一致します。 ちなみに 0x41 は A なので、 「CAFFEE」があったら「C」「FFEE」に分割されてしまいます。 対策は、分割されないようにすること。 utf8文字列を使うと、日本語でも1文字と扱えるようになるので  use utf8 ; を追加、スクリプトはUTF-8で記述  入出力時には、encode/decodeでutf8文字列とバイト列の変換を行う ということになります。 少しややこしいかもしれませんので、書籍はサイトを参考によく勉強してから使ってください http://www.rwds.net/kuroita/program/Perl_unicode.html

kyosuk-ta
質問者

お礼

回答ありがとうございます。 大変参考になりました。 文字コードについてはまだまだ勉強不足のようで 教えていただいたサイトの内容も半分も理解できなかったのですが 今後も勉強していこうと思います。 色々と読んだ後、下の回答者の方の画像を読んで なんとか、この部分は問題が理解できなおすことが出来ました。 ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> use Encode qw(encode_utf8); この書き方が古いのでは。検索してみた感じ、今時はこう書かないみたい。 スクリプトの記述次第では、うまくいくケースもあるので、今のまま頑張る手もあるかも。 (添付画像は、適当にがんばってみた例。でもuse encodingにした方がよいと思います。)

kyosuk-ta
質問者

お礼

回答ありがとうございます 添付していただいた内容で動いたのですが、ナゼ動くかよく分からなかったのですが 上の回答者の方の説明で動く理由が理解でき、解決できました。 コードまで添付してい下さってありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A