【问题标题】:What do people mean when they say “Perl is very good at parsing”? [closed]人们说“Perl 非常擅长解析”是什么意思? [关闭]
【发布时间】:2010-12-25 16:55:51
【问题描述】:

人们说“Perl 非常擅长解析”是什么意思?

Perl 比 Python 或 Ruby 等其他脚本语言更好或更强大的地方在哪里?

【问题讨论】:

  • 对我来说,这表明他们对解析知之甚少,而且可能对 Python 和 Ruby 等语言知之甚少……更不用说诸如 lex/flex 和 yacc/bison 之类的工具了。它表明它们被正则表达式和从简单数据格式中提取模式(它们与“解析”混为一谈)固定。最后,它强烈建议这些人在面临真正的解析问题时,会创建半生不熟且脆弱的代码,这些代码会通过他们简单编造的测试用例,同时会给依赖该代码进行实际工作的人带来痛苦。
  • 半生不熟、脆弱的代码完美适合人们可能合理地期望使用 perl 来完成的那种乏味、一次性的任务...编写 BNF解析日志文件的语法听起来不像是很好地利用时间。
  • 很多东西没有语法,Perl 提供了很多工具来处理这些。正则表达式并不是 Perl 工具箱中唯一的东西。

标签: perl parsing scripting text-parsing scripting-language


【解决方案1】:

这意味着 Perl 最初是为处理文本文件而设计的,并且具有许多使其变得简单的功能:

  • Perl 有很多字符串处理函数:substr, index, chomp, length, grep, sort, reverse, lc, ucfirst, ...
  • Perl 会根据值的使用方式自动在数字和字符串之间进行转换。 (例如,您可以从文件中读取字符串 '100' 并将其添加到其中,而无需先进行字符串到整数的转换)
  • Perl 会自动处理与平台编码(例如 Windows 上的 CRLF)和程序中的逻辑换行符(“\n”)之间的转换。
  • 正则表达式已集成到语法中,而不是单独的库。
  • Perl 的正则表达式是性能和功能的“黄金标准”。
  • Perl 具有完整的 Unicode 支持。

Python 和 Ruby 也有很好的文本处理工具。 (特别是 Ruby 从 Perl 中获得了很多灵感,就像 Perl 从许多其他语言中无耻地借鉴一样。)问哪个更好是没有意义的。用你喜欢的。

【讨论】:

  • 虽然有些人来自$_,但我认为它属于那个名单。您有一个“当前主题”或您正在处理的事情并对其应用各种步骤的想法非常好。
  • 我不会说 Perl 会自动处理行尾。我认为您将其与在 Windows 中写入文本文件混淆了。除非您告诉 Perl 要做什么,否则读取返回的数据并没有什么特别的作用。
  • @brian:平台换行序列和逻辑“\n”之间的转换发生在读取和写入(当然忽略binmode)。我知道你很清楚这一点,所以我觉得你的评论很混乱。我想我可以说“Perl 让您可以根据逻辑换行符进行思考,而不用担心您的操作系统使用的任何顺序”,而无需提及它是如何做到的。
  • @Michael:你混淆了 DOSish perl 的行为和世界其他地方的行为。在 unix 机器上读取带有 Windows 行尾的文件仍然会给您 Windows 行尾。它只是 Windows 上 Perl 的一个特殊功能,当 Perl 知道它对 tty 的写入时。 "\n" 是什么的问题是完全不同的问题。有关详细信息,请参阅 perlport。
【解决方案2】:

不要把 Perl 的优点的陈述当作另一种语言的缺点的陈述。 Perl 非常适合文本处理,但这并不意味着 Ruby 或 Python 很烂。

当人们谈论 Perl “善于解析”时,他们主要是在呼应 Perl 的历史;它是在繁重的文本处理不容易的时代发明的。尝试在 C 或 C++ 中做一些事情(Java 还没有被发明出来!)。过去,Larry 试图使用 sed 和 awk 完成他的工作,但遇到了它们的局限性。他制作了一个工具,使文本更易于使用。

Perl 仍然非常适合文本处理任务,但现在很多其他语言也是如此。

【讨论】:

    【解决方案3】:

    Perl 也适用于 ETL 或批处理动作。获取文件的代码量最少;通过split 将其推送到map,对记录执行一些逻辑业务操作,然后将其写回磁盘。

    我想那是更多的数据处理然后是数据解析,但数据处理是批量数据解析。

    【讨论】:

      【解决方案4】:

      与 C/C++/Java 相比,Perl 在文本解析方面非常出色。

      【讨论】:

      • Igor 可能应该扩展他的回答,指出当 Perl 出现时,文本处理并不是一项简单的任务。 20 年后,人们不再欣赏这种痛苦,因为一切都有 PCRE 等。
      【解决方案5】:

      这可能是因为人们已经习惯了它的构建目的,正如perl documentation 中所描述的那样,因此将文本文件的解析与 Perl 相关联已成为许多人的家常便饭。不排除 Ruby 或 Python,恕我直言,它只是一个家喻户晓的名字。

      Perl 是一种针对扫描任意文本文件、从这些文本文件中提取信息以及基于该信息打印报告而优化的语言。它也是许多系统管理任务的好语言。该语言旨在实用(易于使用、高效、完整)而不是美观(小巧、优雅、最小)。

      【讨论】:

        猜你喜欢
        • 2013-12-23
        • 2011-07-05
        • 2021-07-25
        • 2010-11-22
        • 2012-06-09
        • 2019-12-29
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        相关资源
        最近更新 更多