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

お世話になります。

とある配列から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です。
宜しくお願い申し上げます。

質問者からの補足コメント

  • ご回答有難うございます。
    説明足らずで申し訳ございません。
    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)にしています。

      補足日時:2020/06/05 19:11
  • 前後のソースを記載させて頂きます。

    $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 "既に登録されています";
     }

      補足日時:2020/06/05 19:18

A 回答 (4件)

5.10....



その「HERE in」以降にどう書かれているのかがわからないと何が悪いのかは判断しかねるなぁ.

いっそ正規表現をあきらめるという選択肢もあるけど.
    • good
    • 0

手元で簡単なコードを書いてやってみたけど、5.28(v5.28.1)上でそのまま動作しているので、[]が問題ではないような気がしますが。


その$ary[0]の中身は?
    • good
    • 0
この回答へのお礼

ご回答有難うございました。
無事解決することができました。

お礼日時:2020/06/06 19:52

文字コードは大丈夫なのかなぁ. DB が EUC になってるってことは, あたりまえだけど「DB からとってきたバイト列」も EUC になってるはずだよね. それを, Perl がきちんと認識している (or Perl にきちんと認識させている) んだろうか.



例えば, DB から EUC でやってきたバイト列を Perl が ISO-8859-1 だと思って解釈したら, いくらなんでもまずいよね.
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
ご指摘の通り、肝心の文字コードの変換がうまくいっていないことが原因のようでした。

DBを呼び出した後に
$dbh->do("set names ujis");
とすることで、無事解決することができました。

有難うございました。

お礼日時:2020/06/06 19:51

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] の中に ?? が入るはずがない、ということならば、既に指摘があるように、どこかで文字コード不一致による「文字化け」が発生して、 ? に置き換えられているのではないでしょうか。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
自分もそのサイトを見たのですが、メタ文字というのが[]が該当するかと思い込んでいました。
しかしやはり肝心の文字コードの変換?がうまくいっていないことが原因のようでした。

DBを呼び出した後に
$dbh->do("set names ujis");
とすることで、無事解決することができました。

有難うございました。

お礼日時:2020/06/06 19:51

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