вычисление пользовательского регулярного выражения из STDIN в Perl - PullRequest
0 голосов
/ 11 июля 2009

Я пытаюсь сделать тестер на лету в Perl. В основном он просит вас ввести шаблон, а затем выдает приглашение >>>>, где вы вводите возможные совпадения. Если он совпадает, он говорит «%%%% до сопоставленной части после совпадения», а если нет, то «%%%! Строка, которая не соответствует» Это просто сделать так:

while(<>){
    chomp;
    if(/$pattern/){
        ...
    } else {
        ...
    }
}

но я хочу иметь возможность вводить шаблон как /sometext/i, а не просто sometext Думаю, я бы использовал для этого блок eval? Как бы я поступил так?

Ответы [ 3 ]

1 голос
/ 11 июля 2009

Вы можете написать /(?i:<pattern>)/ вместо /<pattern>/i.

1 голос
/ 11 июля 2009

Это звучит как работа для строки eval , только помните, что не нужно проверять ненадежные строки.

#!/usr/bin/perl

use strict;
use warnings;

my $regex = <>;
$regex = eval "qr$regex" or die $@;
while (<>) {
    print  /$regex/ ? "matched" : "didn't match", "\n";
}

Вот пример запуска:

perl x.pl
/foo/i
foo
matched
Foo
matched
bar
didn't match
^C
0 голосов
/ 11 июля 2009

Это работает для меня:

my $foo = "My bonnie lies over the ocean";

print "Enter a pattern:\n";
while (<STDIN>) {
   my $pattern = $_;
   if (not ($pattern =~ /^\/.*\/[a-z]?$/)) {
      print "Invalid pattern\n";
   } else {
      my $x = eval "if (\$foo =~ $pattern) { return 1; } else { return 0; }";
      if ($x == 1) {
         print "Pattern match\n";
      } else {
         print "Not a pattern match\n";
      }
   }
   print "Enter a pattern:\n"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...