
お世話になります。
とある配列から1番目の値を取得したいのですが、
$ary[0] というように[0]が1番目になると思います。
そしてDBの中からこの値を検索する方法をしているのですが、今までは
if ($username =~ /^$ary[0]$/i){
$flag1 = '1'; last;
}
という書き方で問題ありませんでした。
ただ、perlのバージョンを変えたからか、上記だと
Nested quantifiers in regex; marked by <-- HERE in m/ ・・・
とエラーになり、うまく動作できませんでした。
[]が引っかかっているようなのですが、うまく対処する方法があれば教えて頂けますと幸いです。
現在使用しているのperlのバージョンは5.10です。
宜しくお願い申し上げます。
No.4ベストアンサー
- 回答日時:
Nested quantifiers in regex で検索すると
https://perldoc.jp/docs/perl/5.8.8/perldiag.pod
> Nested quantifiers in regex; marked by <-- HERE in m/%s/
> (F) 括弧を挟まないで、数量子を数量子で修飾することはできません。 つまり、** や +* や ?* といったものは、正しくありません。 <-- HERE で正規表現のどこに問題が発見されたかを示しています。
> 最短一致数量子の *?、+?、?? は、ネストした数量子のように 見えますが、そうではありません。 perlre を参照してください。
とあって
<-- HERE in m/^ ??? <-- HERE ??$/
とあるので、エラーの理由はこの 「??」でしょう。
/^$ary[0]$/
の場合、$ary[0] の内容にメタ文字が含まれていたら、それはメタ文字として処理されます。
おそらく $ary[0] の中に ?? が入っているのでしょう。
文字列をそのまま文字列として使いたいなら、\Q\Eが有効です。
$ary[0] の中に ?? が入るはずがない、ということならば、既に指摘があるように、どこかで文字コード不一致による「文字化け」が発生して、 ? に置き換えられているのではないでしょうか。
ご回答有難うございます。
自分もそのサイトを見たのですが、メタ文字というのが[]が該当するかと思い込んでいました。
しかしやはり肝心の文字コードの変換?がうまくいっていないことが原因のようでした。
DBを呼び出した後に
$dbh->do("set names ujis");
とすることで、無事解決することができました。
有難うございました。
No.3
- 回答日時:
文字コードは大丈夫なのかなぁ. DB が EUC になってるってことは, あたりまえだけど「DB からとってきたバイト列」も EUC になってるはずだよね. それを, Perl がきちんと認識している (or Perl にきちんと認識させている) んだろうか.
例えば, DB から EUC でやってきたバイト列を Perl が ISO-8859-1 だと思って解釈したら, いくらなんでもまずいよね.
ご回答有難うございます。
ご指摘の通り、肝心の文字コードの変換がうまくいっていないことが原因のようでした。
DBを呼び出した後に
$dbh->do("set names ujis");
とすることで、無事解決することができました。
有難うございました。
No.1
- 回答日時:
5.10....
その「HERE in」以降にどう書かれているのかがわからないと何が悪いのかは判断しかねるなぁ.
いっそ正規表現をあきらめるという選択肢もあるけど.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# numpyスライス機能を使った数値計算 2 2023/05/08 16:01
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Excel(エクセル) INDEX関数とMATCH関数を使用し値を返す数式についてです 2 2022/04/20 13:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl tr での変数の使い方
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
vba userFormのSubを標準モジュ...
-
VBSがコンパイルエラーになりま...
-
「デバイスは PRN を初期化でき...
-
モジュールの最大数はいくつな...
-
モジュールとクラスの違いって...
-
VBでグローバル変数を宣言するには
-
エクセルVBAでシートモジュール...
-
エクセルVBA クラスモジュール...
-
標準モジュールを削除したい。(...
-
Excel VBAで、ユーザーフォーム...
-
シャープ製品JH-WB1821 と BCG...
-
外部データソース選択時「未定...
-
system関数とqx演算子の違いに...
-
Excel VBA 定義されたプロージ...
-
Tomcat マイナーバージョン移行...
-
VBAProjectのモジュ...
-
use encoding を使う
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perl 正規表現でエラー
-
型を調べる
-
perl tr での変数の使い方
-
msgboxに何故括弧がないの!
-
perlでの入れ子文字列削除
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
Excel VBAで、ユーザーフォーム...
-
vba userFormのSubを標準モジュ...
-
LCD ディスプレイを Raspberry ...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBSがコンパイルエラーになりま...
-
VBでグローバル変数を宣言するには
-
モジュールの最大数はいくつな...
-
VBAで旧字体を異字体に一括で変...
-
Excel VBA 『Call』で呼び出す...
-
【vba】フォームに書いてあ...
-
VBAで別モジュールへの変数の受...
おすすめ情報
ご回答有難うございます。
説明足らずで申し訳ございません。
if ($username eq $ary[0])あるいはf ($username =~ /^\Q$ary[0]$/i)とするとperl自体にエラーが出なかったので、メタ文字が原因なのかと決めつけてしまっていました。
エラーの中身は、
ERROR = Nested quantifiers in regex; marked by <-- HERE in m/^ ??? <-- HERE ??$/ となっています。
動作していた以前との違いは、Perlのバージョン違いの他に保存しているDB(MySQL)の変更もあります。
以前のMySQLは5.1、現在は5.7.27です。
また、このPerlはEUCで以前のMySQLもEUCですが、今のMySQLはUTFです。
ただ、該当のDBに関してはEUC(ujis)にしています。
前後のソースを記載させて頂きます。
$dbh = DBI -> connect ("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass);
$sth = $dbh->prepare("SELECT name FROM $table");
$sth -> execute();
$num_rows = $sth->rows;
$flag1='0';
for ($i=0; $i<$num_rows; $i++) {
@ary = $sth->fetchrow_array;
if ($username =~ /^$ary[0]$/i){
$flag1 = '1'; last;
}
if ($flag1 != 1){
print "登録可能です";
}elsif ($flag1){
print "既に登録されています";
}