【问题标题】:From Python 2.7 to Perl 5, conversion从 Python 2.7 到 Perl 5,转换
【发布时间】:2016-04-02 21:32:38
【问题描述】:

Perl 5 与 Python 2.7 相比有何不同?

我一直在尝试 Perl 5,它看起来很难,因为我之前尝试打开/读取/关闭文件时已经遇到了问题。

我有正则表达式 Python 代码:

#!/usr/bin/python

import re

SyslogText = open('syslog.txt', 'r')
OutputText = open('results.txt', 'w')
KeywordText = open('keyword.txt', 'r')

listOfKeywords = []

for keyword in KeywordText:
    listOfKeywords.append(keyword)

for string in SyslogText:
    for keyword in listOfKeywords:
        if keyword in string:

            hostName = re.search(r'\s[A-Z]+\s', string, re.I)

            dateAndTime = re.search(r'[A-Z][A-Z][A-Z]\s[0-9]+\s[0-9]{2}\:[0-9]{2}\:[0-9]{2}', string, re.I)

            moreResults = re.search(r'\:\s[^^]+\S', string, re.I|re.M)

            portInfo = re.search(r'[A-z]+[[]\d+[]]', string)

            if portInfo:

                   print '**' + keyword + '**' + ' ' + hostName.group(0) + dateAndTime.group(0) + moreResults.group(0) + ' ' + portInfo.group(0) + '\n'

                   OutputText.write('**' + keyword + '**' + ' ' + hostName.group(0) + dateAndTime.group(0) + moreResults.group(0) + ' ' + portInfo.group(0) + '\n')

            else:

                print ('**' + keyword + '**' + ' ' + hostName.group(0) + dateAndTime.group(0) + moreResults.group(0) + ' ' + keyword + '\n')

                OutputText.write('**' + keyword + '**' + ' ' + hostName.group(0) + dateAndTime.group(0) + moreResults.group(0) + ' ' + keyword + '\n')

使用这个例子,当转换为 Perl 时,如何用 Perl 编写它,尤其是 for 循环?

我在http://perldoc.perl.org/ 网站上学习了 Perl,但对于应该如何编写 for 循环,我并不是很清楚。

我已经开始把它转换成 Perl(它的一部分)

#!usr/bin/perl

use strict;
use warnings;

my $syslogFile = 'syslog';

open (my $info, '<', $syslogFile) or die "Could not open $syslogFile";

while (my $line = <$info>)
{
    chomp $line;
    print "$line\n";
}

我被困在for 循环部分,因为我不太清楚如何用 Perl 编写它。另外,在打开和读取文本文件时是否需要调用close?如果是这样,你什么时候使用它?我确实在 perldoc 中阅读过它,但我不明白。

【问题讨论】:

  • Perl 使用 C 风格的 for 循环,它有一个初始化器、条件和步进//增量器,这与 Python 有很大不同。 (Python 没有初始化器、条件和增量器)。它只是迭代,直到StopIteration 在序列上引发。
  • @AlexanderHuszagh 您在 Perl 代码中并不经常看到这种风格。更流行的构造是foreach-style loop
  • 作为 Perl 的 while() 循环替换了第二个 Python for() 循环,我将把它排除在外。其余(上下)Python for() 循环最好在 Perl 中使用 read entire file into arrayPerl's map function 完成
  • 警告:不要在正则表达式中使用[A-z]它可以匹配大小写的 ASCII 字母,但它也匹配多个标点符号,其代码点位于 @ 之间987654333@ 和 A.

标签: python regex perl python-2.7


【解决方案1】:

Perl 等价于以下形式的 Python 循环:

for X in Y:

其中Y 是一个数组,应该是:

for my $X (@Y) {
    …
}

如果Y 是一个文件,您问题中的while 循环是正确的。


就您的其他问题而言:Perl 中并不严格要求关闭文件,就像在 Python 中也不是一样。 (文件将保持打开状态,直到文件句柄超出范围 - 在这种情况下,当进程退出时会发生这种情况。)

【讨论】:

  • 如果你像 DBaculio 那样使用词法文件句柄,当文件句柄超出范围时,文件将被关闭。
猜你喜欢
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
相关资源
最近更新 更多