2012-05-03 55 views
0

为不Perl程序员,我想,以确保我已经很好地理解一个结构,我要移植到Python,理解一个简单的Perl构建

时使用:

if (s/^([$PChar])(.)/$2/) { 
    print $1,"\n"; 
    $finished = 0; 
} 
  • $ 1,$ 2等的匹配正则表达式
  • S /搜索/与/

取代什么,我真我不确定匹配/替换是在打印$ 1之前完成的吗?并且它是在当前缓冲区(它是$ F,即$ _逐行逐行,在它的空格字符上分割)内“inplace”完成的,也就是改变它(所以如果我理解的很好,([$ PChar])当一个字符串的@开头在上面的表述中被完全删除/丢失时)?

编辑:不,也许它不会丢失,第一个括号部分被捕获,然后打印为$ 1 +新行字符,然后...不,不知道什么变成了$ 2 ...可能是缓冲区更改为秒括号部分? /编辑结束。

还有什么环境或什么是允许在Win平台上进行一些逐步调试的最佳环境?我知道有这个,我不会问这个问题。我不需要学习Perl,只是为了能够阅读和修改这个脚本。

这里是englobing部分:

@F = split; 
for($j=0; $j<=$#F; $j++) { 
    my $suffix=""; 
    $_ = $F[$j]; 
    # separate punctuation and parentheses from words 
    do { 
$finished = 1; 
# cut off preceding punctuation 
if (s/^([$PChar])(.)/$2/) { 
    print $1,"\n"; 
    $finished = 0; 
} 
# cut off trailing punctuation 
if (s/(.)([$FChar])$/$1/) { 
    $suffix = "$2\n$suffix"; 
    $finished = 0; 
} 

整个脚本tokenize.pl可以看出here而原来tar.bz如果​​从here

问候

+0

如果你要发布示例代码,不要发布tar.gz文件,将纯文本复制并粘贴到一些在线键盘上,如codepad.org。 – TLP

+0

@TLP,好的谢谢!直到现在我还不知道codepart.org :) – user1340802

回答

2
# try to delete the first character from the string contained in 
# $_ if that character is one of the characters contained in 
# the string $PChar. The deletion is done by replace the first and 
# second character by only the second character. 
if (s/^([$PChar])(.)/$2/) { 

    # if the replacement was successful, print the deleted character. 
    print $1,"\n"; 
    $finished = 0; 
} 
+0

问题的评论表明$ PChar保存一串标点符号。我没有看tar,但我们假设'$ PChar ='\。,:;]''。然后'([$ PChar])'会捕获字符'.',',',':',';'中的一个字符。实现这一点的更简单的方法是留下第二个括号并说's/^([$ PChar])//'因为它无论如何都不会触及下一个字符。 – simbabque

+0

然后processus的其余部分继续只有第二个字符开始的字符串作为我们的新缓冲区$ _?或者我们继续所有的字符串不变为$ _? Simbabque:是的,它实际上是标点符号开放标记像开放括号。 – user1340802

+0

@ user1340802:替换是内联的,意味着$ _'的内容被改变(第一个字符被删除)。 – codaddict