2015-12-29 2 views
-2

Насколько отличается Perl 5 по сравнению с Python 2.7?От Python 2.7 до Perl 5, конверсия

Я пробовал 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?

Я изучил Perl с веб-сайта http://perldoc.perl.org/, но я не совсем понял все слишком четко, как должен быть записан цикл 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, но я этого не понимаю.

+0

Perl использует цикл цикла C, который имеет инициализатор, условие и шаг// incrementer, который сильно отличается от Python. (Python не имеет инициализатора, условия и приращения). Он просто повторяется до тех пор, пока 'StopIteration' не будет поднят в последовательности. –

+6

@AlexanderHuszagh Вы не видите этот стиль очень часто в коде Perl. Более популярной конструкцией будет цикл [foreach-style] (http://perldoc.perl.org/perlsyn.html#Foreach-Loops). –

+0

Будучи как Perl while(), цикл заменил второй цикл Python for(). Я оставляю это. Оставшиеся (выше и ниже) контуры Python for() лучше всего делать в Perl, используя [читать весь файл в массив] (http://stackoverflow.com/questions/5948360/perl-read-a-file-into-an -array) и [функция отображения Perl] (http://perldoc.perl.org/functions/map.html) –

ответ

2

эквивалент Perl, к петле Python формы:

for X in Y: 

, где Y является массивом, будет:

for my $X (@Y) { 
    … 
} 

В случае, когда Y представляет собой файл, то while петли в вашем правильном вопросе.


Насколько идет ваш другой вопрос: закрытие файлов не является строго обязательным в Perl, так же, как это не в Python либо. (Файл останется открытым до тех пор, пока дескриптор файла не выйдет из области действия - в этом случае это произойдет, когда процесс завершится.)

+1

Если вы используете лексические файловые дескрипторы, как это делает DBaculio, файлы будут закрыты, когда их дескриптор выходит за рамки. – tjd