Я довольно новичок в концепции регулярного выражения. Я понимаю основное регулярное выражение, которое я использую в сценарии 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";
который, кажется, где ошибка.
Не означает, что выражение \ * соответствует выражению, только если оно начинается с *? Я предполагаю, что мне нужно изменить его, чтобы включить другие OR, такие как '/^\ s? Версия: (. *) /' Будет ли/i работать, даже если у меня есть OR, например '$ line = ~/^ \ *? \ S? Версия: (. *) |^\ S? Версия: (. *)/I'? – Droidzone
Я не знаю, что означает «включить другие или подобные», но нет, '\ *?' Означает «соответствовать буквальному * 0 или 1 раз». Вы также можете сделать '[* \ s] *', чтобы сделать все такие символы необязательными. – TLP
@Droidzone Нет ... это не то. '*' необязательно означает, что он не должен быть там ... поэтому '\ *? \ s? | \ s?' означает точно такое же, как '\ *? \ s?'. – TLP