2012-11-05 37 views
2

好的,所以我正在尝试制作自己的标记语言[对于一个班级,我知道这很愚蠢],并且在运行时遇到了很多麻烦。 只要我添加导致调用arraySplitter函数的文本,它似乎就卡住了(只是暂停,我假设会陷入循环中)。如果您愿意,我可以提供信息和输出。这似乎是一个简单的错误,因为我对Perl很新颖。Perl - > HTML选择解析器

#JokeCode -> HTML 

use strict; 
use warnings; 
use Getopt::Std; 
my %opts=(); 

theFunctionThatActuallyParsesTheNonsense($opts{i}); 
my $questionCounter; 
my $tempVar; 
my @arrayForSplit; 
my @goodArray; 
my $curLine; 
sub theFunctionThatActuallyParsesTheNonsense 
{ 
my $outputF = $_[0]; 
$questionCounter= 0; 

while (<LINES>) 
{ 
     $curLine= $_; 
     if($curLine =~ m/&&url/) 
    { 

     @arrayForSplit = split(/ /,$_); 
     $curLine =~ s/$arrayForSplit[1]//; 
     $curLine =~ s/$arrayForSplit[2]//; 
     $curLine =~ s/&&url/<a href="$arrayForSplit[1]">$arrayForSplit[2]/; 
     $curLine =~ s/url&&/<\/a>/; 
     print @arrayForSplit; 

    } 


    $curLine =~ s/\&\&b /<b>/; 
    $curLine =~ s/ b\&\&/<\/b>/; 

    $curLine =~ s/&&i /<i>/; 
    $curLine =~ s/ i&&/<\/i>/; 

    $curLine =~ s/&&u /<u>/; 
    $curLine =~ s/ u&&/<\/u>/; 

    $curLine =~ s/&&tt/<tt>/; 
    $curLine =~ s/tt&&/<\/tt>/; 

    $curLine =~ s/&&grn/<span style="color:#00ff00">/; 
    $curLine =~ s/grn&&/<\/span>/; 

    $curLine =~ s/&&red/<span style="color:#ff0000">/; 
    $curLine =~ s/red&&/<\/span>/; 

    $curLine =~ s/&&blu/<span style="color:#0000ff">/; 
    $curLine =~ s/blu&&/<\/span>/; 

    $curLine =~ s/&&ex/<pre class="code">/; 
    $curLine =~ s/ex&&/<\/pre>/; 

    if($curLine =~ m/&&tf/) 
    { 
     $curLine =~ s/&&tf/<form><br><input type="text" name="$questionCounter"><\/form>/; 
     $curLine =~ s/tf&&//; 
     $questionCounter++; 
    } 
    print "even here?"; 
    if($curLine =~ m/&&mc/) 
    { 
     print "How bout now?"; 
     @goodArray = arraySplitter($curLine); 

     foreach (@goodArray) 
     { 

      $curLine =~ s/&&mc/<input type="radio" name="$questionCounter" value="$_"> $_ <br>/; 
     } 
     $curLine =~ s/&&mc/<br>/; 
     $curLine =~ s/mc&&/<input type="radio" name="questionCounter" style="display: none;"\/>/; 
     $questionCounter++; 
    } 
    print OUT $curLine; 
    print OUT "\n"; 

} 


sub arraySplitter 
{ 
print "Are you still there?"; 
my @retArray; 
my $arrayPlace = 0; 
my @mcArray = split(/ /,$_[0]); 
print @mcArray; 
    if(scalar(@mcArray)-1 < 1) 
    { 
    print "The size of the array is 0"; 
    exit 1; 
    } 
while ($arrayPlace < scalar(@mcArray)-1) 
{ 
    $retArray[$arrayPlace] = $mcArray[$arrayPlace]; 
} 
print @retArray; 
return @retArray; 
} 
} 
+0

虽然知道[你不应该用正则表达式解析HTML/XML](http://stackoverflow.com/a/1732454/459233),Tom Christiansen在他的回复中实现了一个解析器:[哦,是的,你可以使用正则表达式来解析HTML!](http://stackoverflow.com/a/4234491/459233)我建议你使用一些解析器,如[XML :: LibXML](http://search.cpan.org/~shlomif/XML-LibXML-2.0010/LibXML.pod),[XML :: Simple](http://search.cpan.org/~grantm/XML-Simple-2.20/lib/XML/Simple.pm)或甚至[ Marpa :: HTML](http://search.cpan.org/~jkegl/Marpa-HTML-0.112000/lib/Marpa/HTML/Doc/HTML.pod)如果你没有严格的要求reg –

+0

@TudorConstantin谢谢为了回应!我对Perl这个美丽的世界很陌生,并且睁大眼睛,r che che,,相信所有事情都可以通过Perl的美妙功能解析(HAHAHA)。认真。我一直在使用Java,直到我找到一份真正的工作。用java来做这些事情就像用叉子吃汤一样。 –

回答

2

本节:

while ($arrayPlace < scalar(@mcArray)-1) 
{ 
    $retArray[$arrayPlace] = $mcArray[$arrayPlace]; 
} 

...从来没有修改$arrayPlace。所以你有一个无限循环。


它看起来像它试图使@mcArray副本,这将与被做得更好:

@retArray = @mcArray; 

...但因为它看起来像你只需返回@retArray,你可能也只是:

return @mcArray; 

如果这是未完成的代码,你打算做一些改造,再看看map

+0

你太棒了!谢谢! –