Python 不适合像 Perl 那样压缩一个内衬。这主要是出于三个原因:
- 对于 Perl,几乎在所有情况下空格都是无关紧要的。在 Python 中,空格非常重要。
- Perl 有一些对一行代码有用的快捷方式,例如
perl -ne 或perl -pe 在代码行周围放置一个implicit loop。
- 有一个large body a cargo-cultPerl 的一个内衬可以做有用的事情。
总而言之,这个 python 和你在 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...
}
编辑
虽然在 Python 中重写 Perl 是微不足道的,但这里有一些更好的东西:
#!/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
'