저는 Regex라는 개념을 처음 접했습니다. 내가 배쉬 스크립트에서 사용하는 기본적인 정규식을 이해합니다. 다음 코드 스 니펫은 서버의 Wordpress 플러그인을 자동으로 업데이트하기 위해 작성한 프로그램의 코드입니다.Perl 정규식 논리 오류
어쨌든 개념은이 코드가 디렉토리의 .php 파일을 되풀이하여 "Version :", "version :", "*"로 시작하는 패턴 일치 파일을 시도하는 서브 루틴의 일부라는 것입니다. "등의 형식을 사용하고 패턴이 일치하면 다른 하위가 올바른 버전 번호를 얻기 위해": "문자 다음에 나오는 값을 추출하려고 시도합니다.
$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;
}
}
}
문제
내가 논리에 오류가있을 것 같다, 파일이 실제로 일치한다는 것입니다 \ n "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 '와 같이 포함하도록 수정해야만한다고 생각한다. 버전 : (. *) /'$ line = ~/^ \ *? \ s와 (과) 같은 경우에도/i? 버전 : (. *) |^\ s? 버전 : (. *)/i'? – Droidzone
"다른 것과 비슷한 것을 포함하는"의미는 무엇인지 모르겠지만, '\ *?'는 "리터럴 * 0 또는 1 시간 일치"를 의미합니다. '[* \ s] *'를 써서 모든 문자를 선택적으로 만들 수도 있습니다. – TLP
@Droidzone 아니 ... 그게 아니야. '*'는 옵션 일 필요가 없다는 것을 의미합니다. 그래서'\ *? \ s? | \ s? '는'\ *? \ s?'와 똑같은 것을 의미합니다. – TLP