1

次のコードでは、同じ出力を作成して印刷したいと考えていgます。f差は($RE{num}{real})$文字列として与えられます。それを正規表現に変換する方法はありますか?

~/linux/test/perl/library/Regexp/Common/%RE/num/real$ cat main1.pl
#!/usr/bin/env perl

use strict;
use warnings;
use autodie;

use FindBin;
use lib "$FindBin::Bin/.";

use Regexp::Common;

sub f {
  my $x = shift;
  $x =~ s/^($RE{num}{real})$/$1 is real/;
  print "$x\n";
}

f("1.5");
f("15f");
f("1e5");
f(".1e5");
f("a");

my $regex_str='($RE{num}{real})';
#Neither of the following work.
#$regex_str=eval $regex_str;
#$regex_str=qr{$regex_str};
sub g {
  my $x = shift;
  $x =~ s/^$regex_str$/$1 is real/;
  print "$x\n";
}

g("1.5");
g("15f");
g("1e5");
g(".1e5");
g("a");


~/linux/test/perl/library/Regexp/Common/%RE/num/real$ ./main1.pl 
1.5 is real
15f
1e5 is real
.1e5 is real
a
1.5
15f
1e5
.1e5
a
4

3 に答える 3

1

Perl の単一引用符は、変数を補間しません。変数を補間するには、二重引用符を使用します。ただし、正規表現を作成するには、次のqr//演算子を使用できます。

my $regex = qr/$RE{num}{real}$/;
if ( $x !~ $regex ) { 
于 2013-04-07T20:18:39.903 に答える
0

1 つの問題は$、最後に 2 つのトークンがあることです。

my $regex_str='$RE{num}{real}$';
...
if( $x !~ /^$regex_str$/) {
于 2013-04-07T20:19:58.567 に答える