8

正規表現が失敗する理由を特定できません。これが私のコードです:

my $email = "rise@dawn.com";
my ($found) = $email =~ /(rise@dawn\.com)/;
print "Found: $found";

これにより、次の出力が得られます。

C:\scripts\perl\sandbox>regex.pl
Found: rise.com

@ 記号をエスケープすると、出力がまったく得られません。

my $email = "rise@dawn.com";
my ($found) = $email =~ /(rise\@dawn\.com)/;
print "Found: $found";

C:\scripts\perl\sandbox>regex.pl
Found:

誰かが私のエラーについて教えてください。

4

4 に答える 4

8

$emailあなたが補間しているというあなたの宣言では、@dawn これは引用によるものです。

面倒を避けるために、次のように一重引用符を使用してください。

my $email = 'rise@dawn.com';
my ($found) = $email =~ /(rise\@dawn\.com)/;
print "Found: $found";
于 2013-07-07T22:07:50.183 に答える
7

常にuse strict; use warnings;スクリプトの一番上に!

宣言されていないグローバル変数があることを警告します@dawn。配列は二重引用符で囲まれた文字列にも補間できるため、必要です

my $email = "rise\@dawn.com";
my ($found) = $email =~ /(rise\@dawn\.com)/;
print "Found: $found";
于 2013-07-07T22:06:10.973 に答える
6

Perl の二重引用符で囲まれた文字列または正規表現では@、単語が続く は配列の名前として扱われ、その値はスペースで区切られて、文字列または正規表現のその位置に挿入されます"scalar $variables in strings"したがって、コードを機能させるには、 inとregex の@両方をエスケープする必要があります。$email

于 2013-07-07T22:06:28.150 に答える
1

参考までに、 perldocによると:

一重引用符が使用されている場合、正規表現と置換は一重引用符で囲まれた文字列として扱われます。

したがって、以下も機能します。

my $email = q{rise@dawn.com};
my ($found) = $email =~ m'(rise@dawn\.com)';
print "Found: $found";

私は通常\Q...\E、その文字通りのピリオドを扱うために使用しますが、私が言おうとしていたポイントを曖昧にしたくありませんでした.

于 2013-07-08T05:03:30.540 に答える