2013-03-31 6 views
0

Я довольно новичок в концепции регулярного выражения. Я понимаю основное регулярное выражение, которое я использую в сценарии bash. Следующий фрагмент кода - это программа, которую я пишу, чтобы автоматически обновлять плагины Wordpress на сервере.Ошибка логики регулярного выражения Perl

В любом случае, концепция состоит в том, что этот фрагмент кода является частью подпрограммы, которая переписывает файлы в формате .php в каталоге и пытается сопоставить файлы с образцами, начиная с «Версия:», «версия:», «* Версия: "и т. д. из файла, и если шаблон сопоставлен, другой подпрограмма пытается извлечь значение, следующее за символом": ", чтобы получить правильный номер версии.

$searchpath=$path."/".$plugins[$i]; 
     @files = <$searchpath/*.php>; 
     print "Search path is ".$searchpath."\n"; 
OUT: foreach $file (@files) 
     { 
      print "Checking alternate php file: ".$file."\n"; 
      open(txt, $file); 
      while($line = <txt>) 
      { 
       for ($line) 
       { 
       s/^\s+//; 
       s/\s+$//; 
       } 
       if ($line =~ /^Version:|^version:|^\* Version:|\sVersion:/) 
       { 
        print "Version found in file ".$file."\n"; 
        $varfound=1;  
        close(txt); 
        $ver=&read_extract($file); 
        print $ver."\n"; 
        $pluginversion[$i]=$ver; 
        print "Array Num ".$i." Stored plugin name:".$plugins[$i]." Version found ".$ver." Version stored ".$pluginversion[$i]."\n"; 
        last OUT; 
       } 
      } 
     } 

Вопрос заключается в том, что я, кажется, возникли ошибки в логике, а файл фактически совпадает с \ п «phpversion().„“, Версия хранится». phpversion(). «\ n» для поискового запроса. Имея мои ограниченные знания, мне трудно понять, что не так, и будет жаждать некоторых советов.

Другие подводные лодки, упомянутые ниже, включены:

sub read_extract 
{ 
    my $pl_version=""; 
    open(txt, my $file=$_[0]); 
    while($line = <txt>) 
    { 
     for ($line) 
     { 
     s/^\s+//; 
     s/\s+$//; 
     }   
     if ($line =~ /^Version:|^version:|^\* Version:|\sVersion:/) 
     { 
      $pl_version=&extract_version($line); 
     } 
    } 
    close(txt); 
    $pl_version; 
} 

sub extract_version 
{ 
    my $line=$_[0]; 
    $string=substr($line,rindex($line, ":")+1); 
    for ($string) 
    { 
    s/^\s+//; 
    s/\s+$//; 
    } 
    $string; 
} 

Если моя подпрограмма требуется в полной мере, я могу включить его. Однако мои строки отладки показывают это:

Processing xcloner-backup-and-restore...Search path is /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore 
Checking alternate php file: /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore/admin.cloner.html.php 
Checking alternate php file: /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore/admin.cloner.php 
Checking alternate php file: /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore/admin.xcloner-backupandrestore.php 
Checking alternate php file: /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore/admin.xcloner.php 
Checking alternate php file: /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore/cloner.config.php 
Checking alternate php file: /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore/cloner.cron.php 
Checking alternate php file: /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore/cloner.functions.php 
Version found in file /var/www/virtual/joel.co.in/vettathu.com/htdocs/wp-content/plugins/xcloner-backup-and-restore/cloner.functions.php 
" . phpversion() . "\n"; 
Array Num 26 Stored plugin name:xcloner-backup-and-restore Version found " . phpversion() . "\n"; Version stored " . phpversion() . "\n"; 

который, кажется, где ошибка.

ответ

1

Ну, здесь много избыточного кода. Если у вас уже есть строка, зачем вам нужно закрыть файл и снова найти строку? Все, что вам нужно сделать, это захватить строку, когда вы найдете строку:

if ($line =~ /^\*?\s?Version:(.*)/i) { 
    my $version = $1; 

Таким образом, с помощью модификатора /i, ваш матч не чувствителен к регистру. Поместив ? после \* и \s, они могут совпадать с 0 или 1 раз. Используя (.*), остальная часть линии фиксируется до $1.

В вашем регулярном выражении не было ^ начала линейного якоря в последнем матче, который, как я полагал, был опечаткой. Если нет, вы можете просто изменить регулярное выражение на /\bVersion:(.*)/i. И \b полезен только для избежания частичных совпадений, таких как subversion: foo.

+0

Не означает, что выражение \ * соответствует выражению, только если оно начинается с *? Я предполагаю, что мне нужно изменить его, чтобы включить другие OR, такие как '/^\ s? Версия: (. *) /' Будет ли/i работать, даже если у меня есть OR, например '$ line = ~/^ \ *? \ S? Версия: (. *) |^\ S? Версия: (. *)/I'? – Droidzone

+0

Я не знаю, что означает «включить другие или подобные», но нет, '\ *?' Означает «соответствовать буквальному * 0 или 1 раз». Вы также можете сделать '[* \ s] *', чтобы сделать все такие символы необязательными. – TLP

+0

@Droidzone Нет ... это не то. '*' необязательно означает, что он не должен быть там ... поэтому '\ *? \ s? | \ s?' означает точно такое же, как '\ *? \ s?'. – TLP

Смежные вопросы