文字列から、明細と金額にわけてそこから検索できるプログラムを作っています。
テスト用に下記サンプルを作ったのですが、検索明細($moneyvalue)をコーヒーに
した場合のみ、値が戻ってきませんでした。
そこで、中のsplit部分を表示するようにしたところ
★収入=-10000.
★電車=+1000.
★コ=.
★[ヒ=.
★[=+2000.
★雑誌=+240.
★=.
★その他=+500.
0
このように コーヒーの部分だけ上手くsplitが動いていないことが分かりました。
しかしココから手詰まりでどのように直せばいいのか分かりません。
想定される結果
★収入=-10000.
★電車=+1000.
★コーヒー=+2000.
★雑誌=+240.
★その他=+500.
2000
このようにするにはどうしたらいいのか、分かる方おりましたら教えて下さい。
なお、当方はperl初心者です(涙)
----以下サンプルコードです----
#! /usr/local/bin/perl
use Encode qw(encode_utf8);
use CGI;
my $moneyvalue = "コーヒー";
my $moneyline = "収入-10000,電車+1000,コーヒー+2000,雑誌+240、その他+500";
print &chkmoneyValue($moneyline,$moneyvalue);
exit;
#==============================================================================
subchkmoneyValue
{
my ($moneyline , $moneyvalue)=@_;
my $lp=0;
my $flg=0;
my @data= split(/[、,]/, $moneyline);
my $datavalue = 0;
foreach my $wdata (@data)
{
$wdata =~ s/\+/\,\+/;
$wdata =~ s/\-/\,\-/;
my @data2 = split(/[,]/, $wdata);
print "★$data2[0]=$data2[1].\n";
if($data2[0] eq $moneyvalue){
$datavalue=$data2[1];
last;
}
}
return $datavalue;
}
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 …
回答ありがとうございます。
大変参考になりました。
文字コードについてはまだまだ勉強不足のようで
教えていただいたサイトの内容も半分も理解できなかったのですが
今後も勉強していこうと思います。
色々と読んだ後、下の回答者の方の画像を読んで
なんとか、この部分は問題が理解できなおすことが出来ました。
ありがとうございます。
No.1
- 回答日時:
> use Encode qw(encode_utf8);
この書き方が古いのでは。検索してみた感じ、今時はこう書かないみたい。
スクリプトの記述次第では、うまくいくケースもあるので、今のまま頑張る手もあるかも。
(添付画像は、適当にがんばってみた例。でもuse encodingにした方がよいと思います。)
回答ありがとうございます
添付していただいた内容で動いたのですが、ナゼ動くかよく分からなかったのですが
上の回答者の方の説明で動く理由が理解でき、解決できました。
コードまで添付してい下さってありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 a lot of my homeworkはありか? 5 2022/10/13 16:50
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- PHP PHP ページング データベース 1 2022/06/16 10:30
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
- 英語 私の車は、購入してから7年目になるが、これまでに車検を3回受けた。の英訳 11 2022/06/13 03:39
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
ファイルをディレクトリ分配の...
-
openした後、closeしないでプロ...
-
perlのプログラミング 部分入れ...
-
Perlのエラーについてご教授く...
-
画像が表示でnull; this.src
-
perlプログラミング 空白行削除
-
Perlで特定文字列から特定文字...
-
ラズベリーパイ初心者です。 ラ...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
Perlで特定文字列から特定文字...
-
perlをバージョンアップしたら...
-
Wallpaper Engineでおすすめの...
-
arduino の割り込み処理について
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
Perlで時間の計算
-
このファイルを開く方法で困っ...
-
TeraPadエディターの操作方法に...
-
cgiでサーバーにファイルを追加...
-
フローチャート 九九
-
LinuxにおいてのPerlのプログラ...
-
perl 初等プログラミングについて
-
Perlのエラーについてご教授く...
-
こんにちは ブラケッツでプログ...
-
bashスクリプト
-
perlプログラミング 空白行削除
おすすめ情報