下記のソースでエラーになる。
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で書いています。
No.2
- 回答日時:
Perl のバージョンに依る部分もないわけではないが
・UTF-8 で書く
・encoding プラグマを適切に使う
・\Q~\E ではさむ
くらいは思い付くな.
No.3
- 回答日時:
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相当までしかありません。
No.4
- 回答日時:
以下のようにしてください。
1行目( # grep.pl)の下へ
use utf8;
binmode STDOUT, ":encoding(:cp932)";
を追加してください。
以下実行結果です(perl 5.20.1で実行)
--------------
福岡
名古屋
--------------
No.5
- 回答日時:
#4です。
ソースの文字コードはutf-8で記述してください。
有難う御座います。
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. }
No.6
- 回答日時:
>これを、shift jisで書きこむ方法は無いのでしょうか。
>下記にその時のソースを示します。3行目のopen文の指定が間違ってい
>るのでしょうか。
以下のようにしてください。
1. # grep.pl
2. use utf8;・・・・・・・・追加
3. @list1=();
3. open(OUT,">grep.txt");
4. binmode OUT, ":encoding(:cp932)";・・・・追加
No.7ベストアンサー
- 回答日時:
3引数版のopenの使い方を覚えるといいと思います。
・ファイル名と、openモードとを明確に分けられる
・encodingや改行コード変更もできる
・いちいちbinmodeする必要がない
http://perldoc.jp/func/open
助かりました。有難う御座いました。
色んな書き方が有り、分かりにくい所でした。
記述の中でどう言う状況でこの記述をするのか。恐らく歴史的な物もあ
るかとは思いますが。とっつきにくい所でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 英文について教えて下さい。 3 2022/05/03 14:06
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- 英語 Alert Failed to get push token for push notificati 1 2023/05/05 09:21
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- 英語 できるだけ直訳で英語の翻訳をお願いします。(英語→日本語) 1 2022/10/15 20:59
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- その他(プログラミング・Web制作) python 3.10で 同じlistに同じ構文で同じデータ代入した結果が異なる現象発生 7 2022/06/18 11:08
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl で 64ビットint を扱うには?
-
(秀丸)正規表現で、CSV内金額へ...
-
CGI.pm使用時の文字化けについて
-
LCD ディスプレイを Raspberry ...
-
ArduinoのジャイロモジュールMP...
-
Excel VBAでリンク切れをチェッ...
-
モジュールとクラスの違いって...
-
VBAでoutlook365が起動しません。
-
Excel VBAで、ユーザーフォー...
-
Wordで、分かち書きをするVBA ...
-
Excel VBA 定義されたプロージ...
-
Excelで時刻になったら知らせて...
-
powershellで関数名を変更する...
-
グラフのX,Y座標を取得したい
-
vba 標準モジュールインポート...
-
例外処理のフローチャートの記...
-
COBOLで、Shellを起動するには?
-
Perl+DBD::Oracleのエラーがわ...
-
VB.NETでの他アプリケーション...
-
VBAのモジュールについて教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XPathでのワイルドカード指定
-
perlのgrepで日本語の処理でエ...
-
perl で 64ビットint を扱うには?
-
漢字、カタカナ、ひらがな、英...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
LCD ディスプレイを Raspberry ...
-
モジュールとは何ですか
-
ハマったので助けて~。Apache...
-
VBA This Workbookモジュール...
-
VBでグローバル変数を宣言するには
-
グラフのX,Y座標を取得したい
-
モジュールの最大数はいくつな...
おすすめ情報