2013-03-31 5 views
0

저는 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"; 

가되게합니다.

답변

1

글쎄, 여기에는 많은 중복 코드가 있습니다. 이 줄이 이미 있다면 파일을 닫고 줄을 다시 찾으려면 왜해야합니까?

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

것은 그래서, /i 수정을 사용하여, 당신의 일치 대소 문자를 구분하지 않습니다 : 당신이해야 할 모든 당신이 라인을 찾을 때 문자열을 캡처합니다. \*\s 뒤에 ?을 배치하면 0 또는 1 번 일치 할 수 있습니다. (.*)을 사용하면 나머지 줄은 $1으로 캡처됩니다.

당신의 정규식은 마지막 매치에서 라인 입력의 앵커가 없기 때문에 오타라고 생각했습니다. 그렇지 않다면 정규식을 /\bVersion:(.*)/i으로 간단히 변경할 수 있습니다. \b은 부분 일치를 피하는 데에만 유용합니다 (예 : subversion: foo).

+0

\ *는 ~로 시작하는 경우에만 일치합니까? 나는 다른 OR을'/^\ s '와 같이 포함하도록 수정해야만한다고 생각한다. 버전 : (. *) /'$ line = ~/^ \ *? \ s와 (과) 같은 경우에도/i? 버전 : (. *) |^\ s? 버전 : (. *)/i'? – Droidzone

+0

"다른 것과 비슷한 것을 포함하는"의미는 무엇인지 모르겠지만, '\ *?'는 "리터럴 * 0 또는 1 시간 일치"를 의미합니다. '[* \ s] *'를 써서 모든 문자를 선택적으로 만들 수도 있습니다. – TLP

+0

@Droidzone 아니 ... 그게 아니야. '*'는 옵션 일 필요가 없다는 것을 의미합니다. 그래서'\ *? \ s? | \ s? '는'\ *? \ s?'와 똑같은 것을 의미합니다. – TLP