質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

2304閲覧

半角と全角を比較する

shinoda

総合スコア75

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

1クリップ

投稿2015/06/29 06:55

編集2015/06/29 07:48

お世話になります

あるフォームから渡ってきたキーワードをCSVファイルと比較して検索結果を表示するのですが全角、半角ではじかれてしまいうまく動作しません

下記にソースを記載します


① foreach(@shop_dat){
② local($shop_region,$shop_name,$shop_postal,$shop_adress,$shop_tel) =
split(/,/,$);
③ if( ($shop_name =~ /\Q$in{'shop'}\E/i || $in{'shop'} eq '')){
④ push(@result,$
);
}
}

①CSVファイルの行でループ
②CSVから読込んだ1行をカンマで分割(カンマ区切りのため)
③フォームで入力された「in{'shop'}」とCSVの店舗カラム「$shop_name」を比較
(部分一致)
④該当すれば、別変数に一時保管
(全行を参照してループ終了し、④で保管した結果を一覧表示)

以上です。

ご教授いただければ幸いです。


追記

このコードは他の人が書いたもので、私はparlのことがよくわからなく質問しています。
いろいろ見てるうちに気づいたのですが、そもそもフォームから渡ってきた$shop_name を何も変換せずに比較しているように見えるので、普通に考えたら、最初に両方の変数を全、半角に変換して(統一して)比較するのが自然かと思うのですが、違いますでしょうか?

素人なものでよろしければコード込みでご教授いただければ幸いです。

以上、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はい、言われる通り、半角か全角へ統一して比較しないと思った結果となりません。

半角や全角への変換方法ですが・・・
ソースを見た感じ結構古い作りと予想します。
きっと、jcode.pl を読み込んで使用しているのでは・・・?
であるなら、jcode.plを使って変換するのが簡単で早いと思います。

lang

1 2require 'jcode.pl'; 3my $zenkaku = '0-9a-zA-Z'; # 全角英数字 4my $hankaku = '0-9a-zA-Z'; # 半角英数字 5 6my $str = '123abcABC'; 7&jcode::tr(\$str, $zenkaku, $hankaku); 8 9print $str;

これで、$strの文字列は全角英数字から半角英数字へ変換されます。
もしも半角英数字から全角英数字へ変換したい場合は、
&jcode::tr($str, $hankaku, $zenkaku);
と、第2、第3引数を逆にするとできます。

この、jcode::trは便利なのですが弱点があり、「euc」文字コード以外では正常動作しません。
もし、sjis(cp932)のソースの場合は一度eucへコンバートしてsjisへ戻すような処理が必要となります。

投稿2015/07/01 14:07

circus55

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinoda

2015/07/02 04:08

お世話になっております。 ご回答有難うございます。 仰るとおりに古い(作成した方があまりparlの知識がない)ものでした。 またjcodeを使用していました。 >この、jcode::trは便利なのですが弱点があり、「euc」文字コード以外では正常動作 >しません。 >もし、sjis(cp932)のソースの場合は一度eucへコンバートしてsjisへ戻すような >処理が必要となります。 上記の件ですがこのコードはUTF-8で作成されているものなのですが、【euc】に変換して、UTF-8に戻すといった処理で大丈夫でしょうか?またUTF-8なら他にもいい方法などがあるのでしょうか? 独自に調べていてparlのverによっては短いコードで実装できるようですが、使っているparlのverは5.1.4となっておりました。 ひとまず課題はクリア出来ましたのでベストアンサーとさせていただきます。 ご教授ありがとうございました。 追記で便利な方法等があればご教授いただければ幸いです。 以上、ありがとうございました。
circus55

2015/07/02 11:55

あれ?utf8のソースにjcode.plを使用?? Jcode.pmを使っているのかな・・? Perlは5.14の間違いでしょうか? Perl5.1とはすごく古すぎる・・・というか、5.1って見たことないです^^; ソースがutf8であれば、内部コードにして変換するのが簡単だと思います。 my $target_str = "012abcABC"; my $convert = sub { use utf8; use Encode; my $utf8flg = decode_utf8($target_str); $utf8flg =~ tr/0-9a-zA-Z/0-9a-zA-Z/; return encode_utf8($utf8flg); }->(); このようにスコープ作って変換すれば他への影響もなく簡単にできます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問