アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のソースでエラーになる。
1. # grep.pl
2. @list1=();
3. push @list1,"まぐまぐニュース";
4. push @list1,"大阪";
5. push @list1,"福岡";
6. push @list1,"名古屋";
7. push @list1,"京都";
8. @list2=();
9. push @list2,"東京";
10. push @list2,"神田";
11. push @list2,"浜松町";
12. push @list2,"名古屋";
13. push @list2,"福岡";
14. push @list2,"QTNetお客様センター";
15. for $data(@list1){
16. print grep(/^$data/,@list2),"\n";
17. }

Unmatched [ in regex; marked by <-- HERE in m/^まぐまぐニュー <-- HERE ス/ at C:\Users\usui\EDMax\DataGen5\grep.pl line 16.

windowsの環境でshift jisで書いています。

A 回答 (7件)

質問はなんですか?

    • good
    • 1
この回答へのお礼

エラーにならない記述を知りたい。宜しく、お願いします。

お礼日時:2015/07/26 23:59

Perl のバージョンに依る部分もないわけではないが


・UTF-8 で書く
・encoding プラグマを適切に使う
・\Q~\E ではさむ
くらいは思い付くな.
    • good
    • 0

Shift-JIS には通称「ダメ文字」と呼ばれる問題があります。


https://sites.google.com/site/fudist/Home/grep/s …

有名なのは「ソ」に\が含まれていて、\を特殊文字として使うもの処理系で問題になる、というものです。
Perlの正規表現や文字列には\以外にも特殊な扱いをする文字があり、
Perlで何も対策しないまま、スクリプトをShift_JISで書くと、それぞれの日本語文字は「1文字」ではなく「2バイトの文字」として扱われます。
見た目には入ってないように見えますが、Perlにとっては「ー」に [ が含まれていて、対応する] が無い、というエラーになります。

これ以外にもいろいろ注意しないと期待通りに動いてくれません。(特に、正規表現)
一度「perl Shift_JIS」とでも検索してみてください
# 例えば http://nomenclator.la.coocan.jp/perl/shiftjis.htm とか。


対策は次のものがあります。
○「ダメ文字」のダメな部分を打ち消すように記述する。
 例えば、 ー なら ー[] と書くと
 各文字毎に対策が違うので、一律に対応させるのが困難。

○今回のような単純な文字列一致だけの検索なら、 \Q\Eでメタ文字の無効にする。
  http://perldoc.jp/docs/perl/5.14.1/perlre.pod#Qu …

○UTF-8で書き、use utf8 ; する。外部とのやりとりには、 Encodeモジュールや PerlIOによるencodingを使う
 現在のPerlなら、これが無難。


○ use encodingを使う
 推奨されません。
○日本語に対応したPerl (JPerlを使う)
 更新はとっくの昔に終了していて、perl5.0相当までしかありません。
    • good
    • 0

以下のようにしてください。


1行目( # grep.pl)の下へ
use utf8;
binmode STDOUT, ":encoding(:cp932)";
を追加してください。

以下実行結果です(perl 5.20.1で実行)
--------------
福岡
名古屋
--------------
    • good
    • 0

#4です。


ソースの文字コードはutf-8で記述してください。
    • good
    • 0
この回答へのお礼

有難う御座います。
utf8で作ると正常に動きます。
これを下記の様に結果をファイルに出力するとそのファイルは、utf8で
書きこまれます。

これを、shift jisで書きこむ方法は無いのでしょうか。
下記にその時のソースを示します。3行目のopen文の指定が間違ってい
るのでしょうか。

1. # grep.pl
2. @list1=();
3. open(OUT,">grep.txt");
4. push @list1,"まぐまぐニュース";
5. push @list1,"大阪";
6. push @list1,"福岡";
7. push @list1,"名古屋";
8. push @list1,"京都";
9. @list2=();
10. push @list2,"東京";
11. push @list2,"神田";
12. push @list2,"浜松町";
13. push @list2,"名古屋";
14. push @list2,"福岡";
15. push @list2,"QTNetお客様センター";
16. for $data(@list1){
17. print OUT grep(/^$data/,@list2),"\n";
18. }

お礼日時:2015/07/27 06:27

>これを、shift jisで書きこむ方法は無いのでしょうか。


>下記にその時のソースを示します。3行目のopen文の指定が間違ってい
>るのでしょうか。
以下のようにしてください。

1. # grep.pl
2. use utf8;・・・・・・・・追加
3. @list1=();
3. open(OUT,">grep.txt");
4. binmode OUT, ":encoding(:cp932)";・・・・追加
    • good
    • 0

3引数版のopenの使い方を覚えるといいと思います。


・ファイル名と、openモードとを明確に分けられる
・encodingや改行コード変更もできる
・いちいちbinmodeする必要がない

http://perldoc.jp/func/open
    • good
    • 0
この回答へのお礼

助かりました。有難う御座いました。
色んな書き方が有り、分かりにくい所でした。

記述の中でどう言う状況でこの記述をするのか。恐らく歴史的な物もあ
るかとは思いますが。とっつきにくい所でした。

お礼日時:2015/07/27 12:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!