Сравнение кода Perl и Python

 
0
 
Python
ava
shutffl | 09.07.2010, 14:18
Доброго времени суток!!

Решил тут на досуге поковырять таки python.. Для примера решил написать любимую утилитку админа - пассгенератор.. Косо не смотреть.. Я подобное на web-сервак кидаю и генерю пассы для себя и знакомых для разных ресурсов.. В свое время пасс для WoW делал другу как cat /dev/urandom с поледующей выборкой..

К сути.. Вот два аналогичных куска на perl и python.. Python я практически не знаю - только начал присматриваться к нему..


#!/usr/bin/env perl

use strict;
use warnings;

my $alpha = ("qw[email protected]#\$%^&*()_+[]{};':\",./<>?");
my $pass_count = 10;
my $pass_len = 10;

for (my $i=0; $i < $pass_count; $i++) {
my $pass;
for (my $j=0; $j < $pass_len; $j++) {
$pass .= substr($alpha, rand(length($alpha)+1), 1);
}
print "#$i: $pass\n";
}



#!/usr/bin/env python

import string
import random

pass_len = 10
pass_count = 10

alpha = string.lowercase[:] + string.uppercase[:] + '[email protected]#$%^&*()-=_+[]{};\':"<>,./?'

i=0
j=0
new_pass = ""

while (i < pass_count):
while (j < pass_len):
new_pass += random.choice(alpha)
j += 1
print str(i) + ": " + new_pass
new_pass = ""
i += 1
j = 0


Что-то мне в python не нра j = 0 и подобное.. Знатоки, подскажите более короткую версию python-скрипта, плз.. На самом деле к django присматриваюсь постепенно.. Ибо Google да и <censored>Яндекс.. Да и вообще на python сейчас много чего пишется.. Даж на N900 уже PyQt4 портировали..

Собсна для себя пытаюсь решать: копаться с python или дальше Catalyst изучать..

Заранее спасибо!!

P.S. Понимаю, что это общий раздел по python, но уж очень все связано..

später ergänzt:
Вот более короткий вариант для python:

#!/usr/bin/env python

import string
import random

pass_len = 10
pass_count = 10
new_pass = ""
alpha = string.lowercase[:] + string.uppercase[:] + '[email protected]#$%^&*()-=_+[]{};\':"<>,./?'

for i in range(pass_count+1) :
for j in range(pass_len+1):
new_pass += random.choice(alpha)
print str(i) + ": " + new_pass
new_pass = ""
Kommentare (9)
ava
Daevaorn | 09.07.2010, 13:36 #
Например можно так упростить:


#!/usr/bin/env python

import string
import random

pass_len = 10
pass_count = 10

for i in range(pass_count):
print '%s: %s' % (i, ''.join([random.choice(string.printable)\
for __ in range(pass_len)]))
ava
shutffl | 09.07.2010, 13:38 #
Нифига се упрощение ((, Попахивает perl ((,

/me думает..

später ergänzt:
Так.. А "__" - это как $_ в perl?? То есть текущая переменная.. В данном случае ''.join... ??

später ergänzt:
За string.printable отдельное спасибо!!
ava
Daevaorn | 09.07.2010, 14:28 #
Цитата (shutffl @ 9.7.2010, 14:38 findReferencedText)
А "__" - это как $_ в perl?? То есть текущая переменная.. В данном случае ''.join... ??


Нет, это просто плейсхолдер ненужной переменной. В for всегда надо указывать переменную счетчика, но поскольку она не участвует нигде в логике кода, то её принято заменять на "_". В принципе можно использовать любой идентификатор.
ava
shupg | 09.07.2010, 16:14 #
Слегка попроще..


for i in xrange(pass_len):
print '%s: %s' % (i, ''.join(random.sample(string.printable, pass_len)))

ava
chaos | 13.07.2010, 08:01 #
Цитата (shutffl @ 9.7.2010, 10:38 findReferencedText)
За string.printable отдельное спасибо!!

в перл "подобное" можно изобразить следующим образом

print 'a'..'z', 'A'..'Z', 0..9, split(//, "[email protected]#$%^&*()_+~");


+ вот еще более "крутой" вариант smile

print grep /^[[:print:]]$/, map chr($_), 0..127;


PS люблю я чорт возьми тебя перл
ava
chaos | 13.07.2010, 09:10 #
Цитата (shupg @ 9.7.2010, 13:14)
Слегка попроще..





for i in xrange(pass_len):
  print '%s: %s' % (i, ''.join(random.sample(string.printable, pass_len)))



my $pass_len = 10;

my @abc = grep /^[[:print:]]$/, map chr($_), 0..127;
print join "", @abc[map rand @abc, 1..$pass_len];


касательно темы: имхо если писать что-то большое, то Python тк большой объем кода на Perl спустя какое-то время выглядит как набор букавок
Если писать маленькие утилитки типо passgen, то безразницы

ЗЫ

Python 3.1.1 (r311:74483, Aug 17 2009, 17:02:12) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import string
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~ \t\n\r\x0b\x0c'

смущают символы \t\n\r\x0b\x0c
ava
gcc | 13.07.2010, 10:56 #
еще вариант: smile


$ perl -e 'print join"",map $$_[[email protected]$_],([0..9,'a'..'z','A'..'Z'])x20'

ava
shutffl | 13.07.2010, 13:13 #
Цитата (chaos @ 13.7.2010, 09:10 findReferencedText)
смущают символы \t\n\r\x0b\x0c

Угу.. То-то я смотрю у меня в Linux какие-то строчки пустые.. С другой стороны, это не так критично в данном случае.. Да и проверку никто не мешает делать..

В общем, попробовал я python еще немного.. Из perl-сообщества, перешедших на python, как и у меня было ощущение, что что-то не так?? Я никак не могу привыкнуть, если често.. Видимо, на perl слишком много пишу.. Напрашивается вопрос: а оно того стоит?? В смысле python.. Мне знакомый еще пять лет назад говорил, что стоит python поизучать.. Да как-то не до того было.. Да и perl всем устраивает.. Только вот теперь, судя по веяниям современности, "мы" боремся не за качество и поддержу, а за скорость разработки..

Каково ваше мнение??
ava
chaos | 13.07.2010, 13:59 #
мне перл нравится своими библами "из коробки"
Частая задача: загрузить веб-форму, заполнить поля, приатачить файло если надо и "кликнуть" submit.
делать это можно без малейшего знания что такое HTML, HTTP и тп.

На питоне подобного сделать не удалось - надо подтягивать стронние библы или это получается не так приятно как на перле
smile
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  chaos   Daevaorn   shupg   gcc   shutffl
advanced
Absenden