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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

1132閲覧

Perlの正規表現で、ひらがな、カタカナ、漢字をそれぞれ捕捉したい。

snow2021

総合スコア12

Perl

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2023/01/14 01:16

前提

ここに質問の内容を詳しく書いてください。
(例)
Perlで正規表現で困っています。
正規表現で、それぞれ、ひらがな、カタカナ、漢字をif文でひっかけたいのですが、なかなかうまくいきません。
わかる方、ご教授願えればと思います。
よろしくお願いします。

実現したいこと

ここに実現したいことを箇条書きで書いてください。
正規表現で、それぞれ、ひらがな、カタカナ、漢字をif文で捕捉したいのです。

発生している問題・エラーメッセージ

エラーメッセージは何も表示されていません。

該当のソースコード

Perl

1use strict; 2my $hiragana = 'やまだ'; 3my $katakana = 'ヤマダ'; 4my $kanji = '山田'; 5my $msg = ""; 6my $flg = 0; 7if($hiragana =~ /[\p{Hiragana}]/){ 8 $msg = 'ひらがなが含まれています\n'; 9 $flg = 1; 10} 11if($katakana =~ /[\p{Katakana}]/){ 12 $msg .= 'カタカナが含まれています\n'; 13 $flg = 1; 14} 15if($kanji !~ /[\p{Han}]/){ 16 $msg .= '漢字以外が含まれています\n'; 17 $flg = 1; 18} 19if($flg == 1){ 20 print $msg; 21}

試したこと

それぞれ、アルファベットや、ひらがなや、カタカナや、漢字を値に入れて試しても、思うように動きませんでした。
「^[\u3040-\u309F]+$」のような書き方も試しましたがこれも、思うようにいきませんでした。

補足情報(FW/ツールのバージョンなど)

動かしているのは、レンタルサーバーです。
Perlのバージョンは、5.16です。

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

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

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

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

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

melian

2023/01/14 01:25

use utf8; を追加してして下さい。
snow2021

2023/01/14 01:28

そうですね。 質問にuse utf8;を追加する方法がわからないですが、 binmode(STDOUT, ':utf8'); これを、書いてあります。 いかがでしょうか。
snow2021

2023/01/14 01:31

binmode(STDOUT, ':utf8'); と書いてあるのは、手元のローカルのファイルに書いてあります。
melian

2023/01/14 01:32

use strict; の直後に use utf8; を入れてみて下さい。
snow2021

2023/01/14 02:29

use strict; の直後に use utf8; を入れてみたのですが、成功しませんでした。
melian

2023/01/14 02:30

Perl のバージョンの問題ですかね。手元の Perl は v5.34.0 ですが、use utf8; を入れて実行すると、 ひらがなが含まれています カタカナが含まれています という結果になります。
Zuishin

2023/01/14 02:55

ソースコード自身が別のエンコーディングで保存されているのでは?
yuma.inaura

2023/01/14 02:56

「漢字が含まれていない」っていう正規表現に漢字がマッチしないのは正しいんじゃないでしょうか
snow2021

2023/01/14 04:39

Perl のバージョンの問題かもしれないんですね。 情報、ありがとうございます。
snow2021

2023/01/14 04:41

ソースコードは、UTF-8のエンコーディングで保存しています。
snow2021

2023/01/14 04:44

そうですね、「漢字が含まれる」のですから、「!~」じゃなくて「=~」でしたね。 ご指摘、ありがとうございます。
Zuishin

2023/01/14 04:58

このコードでうまくいく環境があることがわかったのであれば、ここに書いていないこと(あなたが省略していること)に原因があるとは思いませんか? まず本番のコードは置いておいて、回答者と共有したコードで試すべきです。 binmode が省略されているのと同じく、演算子も変えたのであれば、指摘されたところを直したコードで試し、質問のコードをそのコードそのものに差し替え、正確な実際の出力を載せるのが良いでしょう。 バージョンが原因というのは考えにくいと思っていますが、それでも回答者の実行結果と異なるのであれば環境や実行方法に問題があると思います。
yuma.inaura

2023/01/14 05:02

「成功しない」というのはどんな結果になってるんだろ
KojiDoi

2023/01/14 05:54

use utf8の必要性については https://teratail.com/questions/bcrd1y64eodj74 で説明したはずですが、結局本質的なことを何一つ理解していただけてなかったようで残念に思いますよ。use utf8とbinmode...は全然目的が違うので、どちらかがもう一方の代用にできるものではありません。 さて、ここまでのサジェストを経て、コードを書き換えて試されたと思います。普通であれば成功しているはずですが、そうでないのだとしたら何がどう「うまくいかない」のか、具体的に説明していただきたいです。無いはずの文字種を検出してしまう? あるはずの文字種を検出しない? メッセージが文字化け? それともほかの問題?
snow2021

2023/01/15 18:09

私のローカルの環境でも上記のソースコードで試したのしたのですが、文言は一切表示されませんでした。 ちなみに、私のローカルの環境は、Windows11で、perlのバージョンは、5.24です。
yambejp

2023/01/16 05:46 編集

長音「ー」はカタカナ扱いでしょうか? 「ヴ」のひらがな「ゔ」は「う゛」だったらどうしますか? 「あゃ」のような存在しない読みはどうしますか?
Zuishin

2023/01/16 07:57

上記コードではだめと再三言われてるのに頑なに直さないところに狂気を感じる。
snow2021

2023/01/18 07:41

氏名チェックや、フリガナチェックに使用している為、長音「ー」はどこにも含まれないと考えています。 同じ理由で、「ヴ」のひらがな「ゔ」は「う゛」も必要ないと思っています。 「あゃ」のような存在しない読みも含まれなくていいと思います。
guest

回答1

0

ベストアンサー

2023-01-16T03:56:31の時点で質問文に掲げてあるスクリプトを一切の修正なしで実行した場合、出力は以下のようになります。

$ perl test230116a.pl Wide character in print at test230116a.pl line 21. ひらがなが含まれています\nカタカナが含まれています\n

多分こういうことがやりたいんだろうと適当に忖度して書き換えたソースが以下です。

use warnings; use strict; use utf8; binmode STDOUT, ':utf8'; my $hiragana = 'やまだ'; my $katakana = 'ヤマダ'; my $kanji = '山田'; my $msg = ""; my $flg = 0; if($hiragana =~ /[\p{Hiragana}]/){ $msg = "ひらがなが含まれています\n"; $flg = 1; } if($katakana =~ /[\p{Katakana}]/){ $msg .= "カタカナが含まれています\n"; $flg = 1; } if($kanji =~ /[\p{Han}]/){ $msg .= "漢字が含まれています\n"; $flg = 1; } if($flg == 1){ print $msg; }

これを実行すると次のようになります。

perl test230116.pl ひらがなが含まれています カタカナが含まれています 漢字が含まれています

いずれにせよ、「文言は一切表示されませんでした」というような状況は再現できません。これはWSL(ubuntu)上のperl5.26.1とMSYS上のperl5.32.1の二つで試しましたが、結果に違いは見られません。

というわけで、質問には書かれていない何らかの間違った処理がなされているものと思われますが、その中身を知りようのない我々には原因も対策も特定しようがないというのが現状と言えます。

投稿2023/01/15 19:09

KojiDoi

総合スコア13671

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

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

snow2021

2023/01/18 07:54

私が、上記ソースでテストしているのは、ローカルの環境がWindowsだからです。 ローカルでutf8;したら、文字化けします。 もちろん、レンタルサーバー上では、utf8;は入れてあります。 それから、Perlのバージョンは、5.24です。 書かれていない処理とお言いますが、テストをしている時は上記コードで行っております。 何らかの間違った処理は、一切書いておりません。 シンタックスエラーもないですし、普通に実行しても、どこにもひっかからず、文言の表示もないまま処理が終わります。 perl5.24以降は、かなりの変更が加えられているように思えるのですが、いかがでしょうか。
KojiDoi

2023/01/18 11:45

> ローカルでutf8;したら、文字化けします。 しません。 文字化けするのはシフトJISを使っているからじゃないですか? 今時、windowsのメモ帳でさえutf8がデフォルトです。全部utf8で保存してください。 > perl5.24以降は、かなりの変更が加えられているように思えるのですが、いかがでしょうか。 5.10.1および5.18.2という古いperlが残っている環境があったのでやってみましたが、 いずれも貴方がいうような事象は確認できませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問