我在php中建造了`wc’

我在php中建造了`wc'

最近,我尝试了John Crickett的编码挑战,并决定分享我的经验。第一个挑战是使用PHP重写经典的Unix工具wc(单词计数器)。虽然我自1997年以来就一直使用Linux,但wc并非我常用的工具,因此我决定深入研究一下。

我最初的想法是用文本编辑器直接编写代码,使用Vim在SSH连接下,平板电脑作为终端,甚至不使用键盘。我选择了PHP作为我的开发语言,认为这应该很简单。结果证明,这是一个糟糕的主意,代码混乱不堪,我将其保留在GitHub仓库中作为警示。

在添加蓝牙键盘并将Vim配置成更像IDE之后,我进行了第二次尝试。这次,我的目标是:

面向对象编程测试驱动开发支持任意大的文件尽可能模拟coreutils wc的行为具有良好的性能

以下是我的主要收获:

立即学习“PHP免费学习笔记(深入)”;

挑战与解决方案:

多字节字符支持: 一个成熟的Unix工具理应支持多字节字符。PHP的mb_strlen函数解决了这个问题。

大文件支持: wc可能需要处理超过系统内存的文件。我需要分块读取文件,避免使用file_get_contents。 处理跨越块边界的单词也需要特殊考虑。

标准输入: 程序需要能够从标准输入(管道和重定向)读取数据。这需要使用流处理。

开发环境的重要性:

我放弃了平时使用的PHPStorm,转而使用一个简单的文本编辑器。这让我意识到IDE提供的自动化功能以及我对此的依赖程度。我尤其怀念代码补全和重构工具。

缺乏重构工具显著增加了我的认知负担,使编程过程变得笨拙。我不得不记住PHP内置函数的参数顺序以及自己代码的结构。这降低了我的开发速度。

我发现缺乏重构工具阻碍了迭代开发。进行代码结构调整变得非常费力,我经常选择保留最初的错误设计,而不是进行修改。

建议:

使用IDE或功能强大的编辑器,至少具备代码补全和代码导航功能。自动化测试至关重要。黑盒测试可以验证程序行为,允许进行无风险的重构。

在第二次尝试中,我进行了大量的测试驱动开发,这极大地提高了我的开发速度和信心。

代码示例:

我最初的count方法:

if ($countmode === countmode::character) {    return strlen($contents);}// ... other cases ...

改进后的count方法,使用匹配表达式:

return match($countMode) {    CountMode::CHARACTER => strlen($contents),    CountMode::MB_CHARACTER => mb_strlen($contents),    CountMode::LINE => count(preg_split('(rn|r|n)', $contents)) - 1,    CountMode::WORD => static::countWords($contents)};

其他收获:

生成器函数非常强大且易于使用。页面大小对文件加载性能至关重要。枚举类型非常有用。箭头函数无法修改其父作用域中的标量变量。

总而言之,这是一个很有挑战性的经历,让我学到了很多东西。我的完整解决方案已上传至GitHub。

以上就是我在php中建造了`wc’的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1252784.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月10日 00:15:54
下一篇 2025年12月10日 00:16:06

相关推荐

  • PHPStorm错误检测中的红色波浪线如何消除?

    轻松解决PHPStorm恼人的红色波浪线! 在PHP开发中,PHPStorm的代码检查功能会用红色波浪线标注潜在错误,例如尝试实例化一个抽象类或接口。即使代码已处理异常,波浪线仍然存在,影响代码阅读体验。 快速解决方法: PHPStorm 提供了便捷的设置来禁用此类警告。只需点击IDE右下角的人形图…

    2025年12月10日
    000
  • 快速链接管理器

    fastlinkmanager:高效管理短链接和重定向的利器 FastLinkManager是一个简洁易用的脚本,用于管理短链接及重定向,支持英语和波斯语两种语言。 它提供三种便捷的短链接创建方式: 自动生成: 脚本自动为每个链接生成唯一的短ID。自定义短链接: 您可以手动设置您想要的短链接。域名替…

    2025年12月10日
    000
  • 一对具有相等数字总和的最高总和

    > 2342。具有等分总和 总和的最高总和 难度:中等 >>主题:数组,哈希表,排序,堆(优先级队列) >您得到了由正面整数组成的0个索引数字。您可以选择两个索引i和j,以便i!= j,数字数字的数字之和等于nums [j]。。 返回 nums [i] nums [j]的最大…

    好文分享 2025年12月10日
    000
  • 优化PHP应用程序:为什么单独阅读和写入模型很重要

    模型是与数据存储交互的理想工具。它们定义数据的结构,确保与数据存储(通常是数据库)兼容。模型不仅验证输入数据,辅助数据写入,还能用于数据检索。然而,除了简单的CRUD应用之外,将同一个模型用于读写通常并非最佳实践。让我们深入探讨原因。 创建模型 让我们以一个简单的用户模型和存储库接口为例,这里无需详…

    2025年12月10日
    000
  • PHP本地开发工具5

    > phpstudy Web:Web开发的综合工具 PhPstudy Web是一种非常流行且用户友好的软件,旨在帮助开发人员有效地设置和管理Web服务器和PHP环境。 PhpStudy Web以其简单性和多功能性而闻名,在网络开发社区中广泛使用,尤其是用于本地开发和测试。 什么是phpstud…

    2025年12月10日
    000
  • 为什么我讨厌WordPress,但是为什么它仍然很棒和必要

    WordPress占据着超过40%的网站市场份额,是目前最流行的内容管理系统(CMS)。然而,在软件工程师群体中,特别是后端开发和可扩展Web应用领域的工程师,WordPress因其低效、臃肿和令人沮丧的特性而臭名昭著。 我个人非常不喜欢WordPress。我花费了大量时间处理其混乱的代码库、解决插…

    2025年12月10日
    000
  • PHP 8如何设置适当的文件权限

    PHP 8 文件权限安全高效设置指南:避免使用 chmod 777,根据不同文件类型设置权限(如 Web 根目录:755,数据文件:640),考虑使用 umask 限制新创建文件的权限,权衡安全与性能间的平衡,定期检查和更新权限设置。 PHP 8 文件权限:安全与效率的平衡 很多新手在 PHP 8 …

    2025年12月10日
    000
  • 与同一产品的元组

    1726。与同一产品的元组 难度:中等 >主题:数组,哈希表,计数 给定一个不同的阵列,正整数,返回。> >示例1: >输入: nums = [2,3,4,6]>输出: 8 >说明:有8个有效的元组: (2,6,3,4) , (2,6,4,3) , (6,2,3,…

    好文分享 2025年12月10日
    000
  • 与作曲家制作和共享PHP库

    Composer已成为PHP项目依赖管理和代码复用的核心工具。无论您是贡献开源项目还是提升个人开发效率,学习创建Composer包都是一项非常有价值的技能。本文将引导您完成构建和共享个人PHP库的完整流程。 准备工作 在开始之前,请确保您已具备以下条件: 扎实的PHP和Composer基础知识。已在…

    2025年12月10日
    000
  • 清除数字

    算法题:清除数字 (难度:简单) 题目描述:给定一个字符串 s,其中包含小写英文字母和数字。你需要重复执行以下操作,直到字符串中不再包含数字:找到第一个数字,并删除该数字以及它左侧最近的非数字字符。最终返回删除所有数字后的字符串。 示例: 输入: s = “abc” 输出: …

    2025年12月10日
    000
  • 通过Laravel和Livewire邀请开发ERP

    大家好, 我最近完成了一个基于Web的计费系统项目,使用Laravel和Livewire框架构建。最初,这个项目只是为了满足朋友的需求,帮他创建一个简单的客户交易记录系统。 我通过在数据库中存储产品信息,然后将这些产品添加到发票中来实现发票/账单的创建功能。 随着项目的进展,我逐步添加了更多功能,例…

    2025年12月10日
    000
  • WebFormSPHP更新到WebFARSJS

    php webforms核心技术详解:服务器端与客户端的无缝交互 WebForms核心技术实现了服务器端PHP类与客户端WebFormsJS库的无缝通信。 最新的PHP WebForms类已完全兼容最新版本的WebFormsJS库,并充分利用了1.6版本的所有新功能。 该技术支持所有HTML事件(例…

    2025年12月10日 好文分享
    000
  • 特殊阵列i

    3151。特殊阵列i 难度:> easy 主题: array special如果其每对相邻元素都包含两个具有不同奇偶校验的数字。>您有一个整数数字。如果nums为a special 数组,返回true,否则,返回false。>>示例1: >输入: nums = [1]&…

    好文分享 2025年12月10日
    000
  • 检查数组是否被分类并旋转

    题目:1752. 检查数组是否已排序并旋转 难度:中等 主题:数组 给定一个数组 nums,如果该数组最初按非递减顺序排序,然后旋转了任意数量的位置(包括零),则返回 true;否则,返回 false。 原始数组中可能包含重复元素。 注意:一个数组 a 旋转 x 个位置后得到一个相同长度的数组 b,…

    2025年12月10日
    000
  • 创建数据库

    项目概述:构建旅游代理信息系统 本项目旨在开发一个基于MySQL数据库的旅游代理信息系统,支持代理商的未来发展和营销策略。系统将管理代理商、客户、住宿信息(公寓、房屋、酒店)、航班信息以及预订等功能。项目团队由3名成员组成,预计完成时间为12小时。最终成果将包含两个虚拟机,并包含数据库、逻辑数据模型…

    2025年12月10日
    000
  • 在DB中创建一个新字段:编辑迁移创建表或使用Alter Table创建新的迁移?

    对于那些直接在PhpMyAdmin中创建纯SQL表的人来说,迁移是一场革命。正如git vers and源代码一样,迁移是处理您的数据库的一种方式 请参阅有关codeigniter迁移的文档 使用迁移更容易构建您的DB并具有其演变的历史 Codeleter数据库迁移:命令的说明 迁移 –…

    好文分享 2025年12月10日
    000
  • 网格中的最大鱼数

    2658。网格中的鱼数 中的最大数量 难度:中等 >主题:数组,深度优先搜索,广度优先搜索,联合查找,矩阵 >您得到了0-索引2d矩阵网格的大小m x n,其中(r,c)表示: 如果网格[r] [c] = 0或a水含有网格[r] [c]鱼的细胞,如果网格[r] [c] > 0. 渔…

    2025年12月10日
    000
  • Lambda和常规功能之间的实际差异(使用PHP)

    函数上下文与闭包 在PHP中,当函数作为参数传递或需要访问外部变量时,需要使用use关键字来创建闭包。这在Laravel和Lumen框架的路由分组中很常见。例如: $router->group([‘prefix’ => ‘admin’], function() use ($router)…

    2025年12月10日
    000
  • 冗余连接

    684。冗余连接 难度:中等 >>主题:深度优先搜索,广度优先搜索,联合查找,图形 在这个问题中,一棵树是连接且没有循环的无向图。>您获得了一个图形,该图是从1到n标记的n个节点开始的树,并增加了一个边缘。添加的边缘具有从1到n选择的两个不同的 的顶点,并且不是已经存在的边缘。该图…

    2025年12月10日
    000
  • 将节点分为最大组数

    2493。将节点分为最大组 > 难度: hard >主题:广度优先搜索,联合查找,图形 >给您一个正整数n,代表无向图中的节点的数量。节点从1到n。>您还会给您一个2d整数数组边缘,其中边缘[i] = [a i ,bi>]表示存在bivecrectional 节点ai …

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信