- ベストアンサー
正規表現の中の変数の表記のしかた
- 正規表現中の変数の表記方法やエスケープの必要性について質問です。
- if文を使用した正規表現の記述が思った通りに動作しないため、解決策を求めています。
- インターネット上の情報や持っている本では望んでいる情報にはたどり着けず、ヘルプを求めています。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
$in{n} の {n} の n が実際はリテラルの数値である場合は、{n} が量指定子と解釈されてしまいます。 use strict; my %hash = qw(2 two two 2); print "match\n" if "xtwoy2z" =~ /$hash{two}/; # OK print "match\n" if "xtwoy2z" =~ /$hash{2}/; # エラー(Global symbol "$hash" ...) エラーメッセージから $hash は、スカラー変数と解釈されていることがわかります。use strict もなく、スカラー変数の $in がない場合は、/&n=$in{2}&/ は /&n={2}&/ という正規表現が適用されることになります。エラーを回避するためには、kmee さんの回答にある ${in{n}} とするか、キーをクォートして $in{'n'} のようにするか、あるいはキーを変数経由で渡すなどのいくつかの方法があります。
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
おっと, そんな落とし穴があるんですか>#5. 知らなかった.... さておき, $test にどんな文字列が入っていて, $in{n} の値がどうなっているのかが分からなければ「正しい」かどうかなど判断のしようがありません.
お礼
ありがとうございます >$test にどんな文字列が入っていて, $in{n} の値がどうなっているのか 確かに今回説明不足の部分が多かったです ($testはあまりにも長ったらしい文字列だったので省略してました)
- kmee
- ベストアンサー率55% (1857/3366)
#2にもあるように、 $in{n}が 「ハッシュ%inの'n'要素」で合ってますか?、ということです。 「ハッシュ%inの$n要素」とか「リスト@inの$n要素」とかではないですよね? 期待通りにならない理由は、ここだけでは判断できません。 ・$in{n}に正規表現のメタ文字が含まれている。 →単純な比較ならindexがいいのでは? ・$test,$in{n}に期待した文字列が入っていない ・実はifが実行されているが、期待通りの動作になっていないので「if節が実行されていない」と誤解している ・そもそも、このif文を通っていない。(この外側にあるifやループで条件が不成立とか、このifのあるsubが呼ばれてないとか) 「何度もトライアンドエラーできる環境下のものではなく」とはありますけど、一つ一つ確認していくのが結局は近道だと思いますよ。「何度もトライアンドエラーできる環境」を作ってでも。
- okmotokun
- ベストアンサー率59% (92/155)
> 必ずヒットするものがあるはずなのにif節内に行ってくれない パターン/&n=$in{n}&/ は、 "&n=" . $in{n} . "&" ということですが、 検索文字列に含まれるのは、"&n=$in{n}&" ではありませんか。 if($test =~ /&n=$in{n}&/){...}elsif($test =~ /&n=$in{n}&/){...} でテストしてみたら、どうですか。
お礼
ありがとうございます。 textファイルの中身を処理している構文なのですが、その構文では &n=×××& が入っているんです (×××は半角英数) つまり、&n=...ではなくtext上では&n=...です >テストしてみたら、どうですか 確かにトライアンドエラーが基本だと思うのですが、今回ちょっと簡単にテストして元に戻してといったことができない環境にあるので、できればスパッと回答頂きたいなと (長めのコードの中の一部分なので、そこだけにとラップかけて検証することができないので)
- Tacosan
- ベストアンサー率23% (3656/15482)
m// は一種のクォートで, 区切りに ' を使う場合 (つまり m'') を除いて「ダブルクォートでくくった文字列」として解釈されます. 従って "&n=$in{n}&" と同様正しい, ということになります. $in{n} は「ハッシュ %in の, キー 'n' に対する値」ですね. 「思った行動をおこしてくれず」の根拠は不明.
お礼
ありがとうございます >と同様正しい, ということになります 特に間違った構文ではないということなんですね >$in{n} は「ハッシュ %in の, キー 'n' に対する値」ですね はい、そうです >「思った行動をおこしてくれず」の根拠は不明 あ、分からなかったでしょうか、すみません。 ifの条件にマッチするものまでif節に入ってくれないという意味です ようはifの意味をなしてなかったというか
- kmee
- ベストアンサー率55% (1857/3366)
${in{n}} かなぁ。 ところで、 $in{n}であってます? $in{$n}とかではないですね?
お礼
ありがとうございます。 >$in{n}であってます? 何があってるのかと聞かれているのかちょっとよく分からないので質問の回答になってるのか分かりませんが、記述ミスではありません。(正規表現内部でこの記述が正しいかどうかは分かりません。それをお尋ねしているので)
お礼
回答ありがとうございました。 確かに数値のみの場合もありますので、量指定子として解釈されているのだろうと想像できます >${in{n}} とするか、$in{'n'} のようにするか、あるいはキーを変数経由で渡す そのような方法があったのですね 非常に参考になりました。 本当にありがとうございました