Python не так хорошо подходит для компактных лайнеров, как Perl. Это в первую очередь по трем причинам:
- С Perl, пробелы незначительны почти во всех случаях. В Python пробелы очень важны.
- В Perl есть несколько полезных ярлыков для однострочников, таких как
perl -ne
или perl -pe
, которые помещают неявный цикл вокруг строки кода.
- Существует большое тело грузового культа Вкладыши Perl one для выполнения полезных задач.
Тем не менее, этот питон близок к тому, что вы опубликовали в Perl:
curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" | python -c '
import sys
for s in sys.stdin:
s=s.strip()
if not s: print '\t',
else: print s
'
Это немного сложно сделать лучше, потому что, как указано в моем комментарии, Perl, который вы разместили, является неполным. У вас есть:
perl -ne 'print "\t" if //; print "$2\n" if /(.*)/;'
Что эквивалентно:
LINE:
while (<>) {
print "\t" if //; # print a tab for a blank line
print "$2\n" if /(.*)/; # nonsensical. Print second group but only
# a single match group defined...
}
Редактировать
Хотя переписывать этот Perl в Python тривиально, здесь есть кое-что получше:
#!/usr/bin/python
from xml.dom.minidom import parseString
import sys
def get_XML_doc_stdin(f):
return xml.dom.minidom.parse(f)
def get_tagged_data2(tag, index=0):
xmlData = dom.getElementsByTagName(tag)[index].firstChild.data
return xmlData
data=sys.stdin.read()
dom = parseString(data)
ele2=get_tagged_data2('title')
print ele2
count=int(get_tagged_data2('fullcount'))
print count,"New Messages:"
for i in range(0,count):
nam=get_tagged_data2('name',i)
email=get_tagged_data2('email',i)
print " {0}: {1} <{2}>".format(i+1,nam,email)
Теперь сохраните это в текстовом файле, запустите на нем chmod +x
, затем:
curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" |
/path/pythonfile.py
Это производит это:
Gmail - Inbox for xxxxxxx@gmail.com
2 New Messages:
1: bob smith <bob@smith.com>
2: Google Alerts <googlealerts-noreply@google.com>
редактировать 2
И если вам это не нравится, вот строковый фильтр Python 1:
curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" |python -c '
import sys, re
for t,m in re.findall(r"<(title|name)>(.*)<\/\1>",sys.stdin.read()):
print "\t",m
'