perlfaq - 有关 Perl 的常见问题
版本 5.20210520
perlfaq 包含多份文档,回答了有关 Perl 和 Perl 编程的最常见问题。它按主题分为本文档中概述的九个主要部分。
perlfaq 是一份不断发展的文档。在 https://perldoc.perl5.cn/perlfaq 阅读最新版本。它还包含在标准 Perl 发行版中。
perldoc
命令行工具是标准 Perl 发行版的一部分。要阅读 perlfaq
$ perldoc perlfaq
搜索 perlfaq 问题标题
$ perldoc -q open
查看 https://github.com/perl-doc-cats/perlfaq/wiki。如果您没有找到您的建议,请针对 https://github.com/perl-doc-cats/perlfaq 创建一个问题或发出请求。
一旦获得批准,更改将随下一个 Perl 版本一起发布,随后出现在 https://perldoc.perl5.cn/perlfaq。
尝试 perlfaq2 中的资源。
本部分常见问题解答回答了关于 Perl 的非常一般、高级别的疑问。
Perl 是什么?
谁支持 Perl?谁开发它?为什么它是免费的?
我应该使用哪个版本的 Perl?
Perl 4、Perl 5 或 Raku(Perl 6)是什么?
Raku(Perl 6)是什么?
Perl 的稳定性如何?
Perl 的新版本多久发布一次?
Perl 难学吗?
Perl 与其他语言(如 Java、Python、REXX、Scheme 或 Tcl)相比如何?
我可以在 Perl 中执行 [任务] 吗?
我什么时候不应该使用 Perl 编程?
“perl”和“Perl”有什么区别?
什么是 JAPH?
我如何说服其他人使用 Perl?
本部分常见问题解答回答了有关在哪里查找 Perl 的源代码和文档、支持和相关事项的问题。
哪些机器支持 Perl?我在哪里可以获取它?
我如何获取 Perl 的二进制版本?
我没有 C 编译器。我如何构建自己的 Perl 解释器?
我将 Perl 二进制文件从一台机器复制到另一台机器,但脚本无法工作。
我抓取了源代码并尝试编译,但 gdbm/动态加载/malloc/链接/... 失败了。我如何使其工作?
Perl 有哪些可用的模块和扩展?CPAN 是什么?
我可以在哪里获得有关 Perl 的信息?
perl.com 是什么?Perl Mongers 是什么?pm.org 是什么?perl.org 是什么?cpan.org 是什么?
我可以在哪里发布问题?
Perl 书籍
哪些杂志有 Perl 内容?
我应该阅读哪些 Perl 博客?
Perl 有哪些邮件列表?
我可以在哪里购买 Perl 的商业版本?
我应该将错误报告发送到哪里?
本部分常见问题解答回答了与程序员工具和编程支持相关的问题。
我如何执行(任何事情)?
我如何以交互方式使用 Perl?
我如何查找在我的系统上安装了哪些模块?
我如何调试我的 Perl 程序?
我如何分析我的 Perl 程序?
我如何交叉引用我的 Perl 程序?
Perl 有美化打印机(格式化程序)吗?
有 IDE 或 Windows Perl 编辑器吗?
我可以在哪里获得 vi 的 Perl 宏?
我可以在哪里获得 emacs 的 perl-mode 或 cperl-mode?
我如何使用 Perl 使用 curses?
我如何在 Perl 中编写 GUI(X、Tk、Gtk 等)?
如何使我的 Perl 程序运行得更快?
如何使我的 Perl 程序占用更少的内存?
返回对局部或词法数据的引用是否安全?
如何释放数组或哈希表,以便我的程序缩小?
如何使我的 CGI 脚本更高效?
如何隐藏我的 Perl 程序的源代码?
如何将我的 Perl 程序编译成字节码或 C?
如何在 [MS-DOS、NT、...] 上使 #!perl
正常工作?
我可以在命令行上编写有用的 Perl 程序吗?
为什么 Perl 单行命令在我的 DOS/Mac/VMS 系统上不起作用?
我可以在哪里学习 Perl 中的 CGI 或 Web 编程?
我可以在哪里学习面向对象的 Perl 编程?
我可以在哪里学习将 C 与 Perl 链接?
我已经阅读了 perlembed、perlguts 等,但我无法将 perl 嵌入到我的 C 程序中;我做错了什么?
当我尝试运行我的脚本时,我收到了此消息。这是什么意思?
什么是 MakeMaker?
本部分常见问题解答回答了与操作数字、日期、字符串、数组、哈希表和各种数据问题相关的问题。
为什么我得到的是长小数(例如,19.9499999999999),而不是我应该得到(例如,19.95)的数字?
为什么 int() 会损坏?
为什么我的八进制数据没有正确解释?
Perl 有 round() 函数吗?ceil() 和 floor() 呢?三角函数呢?
如何在数字表示/基数/进制之间转换?
为什么 & 无法按我想要的方式工作?
如何对矩阵进行乘法?
如何在一系列整数上执行操作?
如何输出罗马数字?
为什么我的随机数不是随机的?
如何在 X 和 Y 之间获取随机数?
如何找到一年中的哪一天或哪一周?
如何找到当前的世纪或千年?
如何比较两个日期并找出差异?
如何获取一个字符串并将其转换为纪元秒?
如何找到儒略日?
如何找到昨天的日期?
Perl 是否有 2000 年或 2038 年问题?Perl 是否符合 Y2K 标准?
如何验证输入?
如何取消字符串转义?
如何删除连续的成对字符?
如何在字符串中展开函数调用?
如何查找匹配/嵌套的任何内容?
如何反转字符串?
如何展开字符串中的制表符?
如何重新格式化段落?
如何访问或更改字符串的 N 个字符?
如何更改某个内容的第 N 个出现?
如何在字符串中计算子字符串出现的次数?
如何将一行中的所有单词大写?
如何在 [字符] 内除外时,分割以 [字符] 分隔的字符串?
如何从字符串的开头/结尾去除空白?
如何用空格填充字符串或用零填充数字?
如何从字符串中提取选定的列?
如何查找字符串的音标值?
如何在文本字符串中展开变量?
Perl 有类似 Ruby 的 #{} 或 Python 的 f 字符串的东西吗?
总是引用 "$vars" 有什么问题?
为什么我的 <<HERE 文档不起作用?
列表和数组有什么区别?
$array[1] 和 @array[1] 有什么区别?
如何从列表或数组中删除重复元素?
如何判断某个元素是否包含在列表或数组中?
如何计算两个数组的差?如何计算两个数组的交集?
如何测试两个数组或哈希是否相等?
如何查找第一个满足条件的数组元素?
如何处理链表?
如何处理循环列表?
如何随机洗牌数组?
如何处理/修改数组的每个元素?
如何从数组中选择一个随机元素?
如何排列列表的 N 个元素?
如何按(任何内容)对数组进行排序?
如何操作位数组?
为什么 defined() 对空数组和哈希返回 true?
如何处理整个哈希?
如何合并两个哈希?
如果在迭代哈希时添加或删除键会发生什么?
如何按值查找哈希元素?
如何知道哈希中有多少个条目?
如何对哈希进行排序(可以选择按值而不是按键排序)?
如何始终保持我的哈希排序?
哈希中的“delete”和“undef”有什么区别?
为什么我绑定的哈希不进行已定义/存在区分?
我如何在进行到一半时重置 each() 操作?
我如何从两个哈希中获取唯一键?
我如何将多维数组存储在 DBM 文件中?
我如何让我的哈希记住我将元素放入其中的顺序?
为什么在哈希中将未定义元素传递给子例程会创建它?
我如何制作 Perl 等效于 C 结构/C++ 类/哈希或哈希或数组的数组?
我如何将引用用作哈希键?
我如何检查多级哈希中是否存在键?
我如何防止在哈希中添加不需要的键?
我如何正确处理二进制数据?
我如何确定标量是数字/整数/整数/浮点数?
我如何在程序调用之间保持持久数据?
我如何打印或复制递归数据结构?
我如何为每个类/对象定义方法?
我如何验证信用卡校验和?
我如何为 XS 代码打包双精度或浮点数数组?
本部分讨论 I/O 和“f”问题:文件句柄、刷新、格式和页脚。
我如何刷新/取消缓冲输出文件句柄?我为什么要这样做?
我如何在文件中更改、删除或插入一行,或追加到文件开头?
我如何计算文件中的行数?
我如何从文件中删除最后 N 行?
我如何从程序中使用 Perl 的-i
选项?
我如何复制文件?
我如何创建临时文件名?
我如何操作固定记录长度的文件?
我如何使文件句柄对子例程为局部?我如何在子例程之间传递文件句柄?我如何制作文件句柄数组?
我如何间接使用文件句柄?
我如何将文件句柄打开为字符串?
我如何设置页脚格式以与 write() 一起使用?
如何将 write() 写入字符串?
如何输出带逗号的数字?
如何转换文件名中的波浪号 (~)?
为什么以读写方式打开文件时会将其清除?
为什么在使用 <*> 时有时会收到“参数列表太长”的提示?
如何打开以“>”开头或以空格结尾的文件名?
如何可靠地重命名文件?
如何锁定文件?
为什么不能直接 open(FH, ">file.lock")?
我仍然不懂锁定。我只想增加文件中的数字。如何做到这一点?
我只想在文件末尾追加少量文本。是否仍然需要使用锁定?
如何随机更新二进制文件?
如何在 perl 中获取文件的时间戳?
如何在 perl 中设置文件的时间戳?
如何同时打印到多个文件?
如何一次性读取整个文件?
如何按段落读取文件?
如何从文件或键盘读取单个字符?
如何判断文件句柄上是否有等待的字符?
如何在 perl 中执行 `tail -f`?
如何在 Perl 中 dup() 一个文件句柄?
如何按编号关闭文件描述符?
为什么不能在 DOS 路径中使用“C:\temp\foo”?为什么 `C:\temp\foo.exe` 不起作用?
为什么 glob("*.*") 无法获取所有文件?
为什么 Perl 允许我删除只读文件?为什么 `-i` 会破坏受保护的文件?这难道不是 Perl 中的 bug 吗?
如何从文件中选择随机行?
为什么在打印行数组时会出现奇怪的空格?
如何遍历目录树?
如何删除目录树?
如何复制整个目录?
此部分出人意料地小,因为 FAQ 的其余部分都包含了涉及正则表达式的答案。例如,解码 URL 和检查某个内容是否为数字可以使用正则表达式来处理,但这些答案可以在此文档的其他地方找到(确切地说,在 perlfaq9:“如何在 Web 上解码或创建那些 %- 编码”和 perlfaq4:“如何确定标量是数字/整数/浮点数”中)。
如何在不创建难以理解且难以维护的代码的情况下使用正则表达式?
我在匹配多行时遇到问题。出了什么问题?
如何提取位于不同行上的两个模式之间的行?
如何使用正则表达式匹配 XML、HTML 或其他讨厌、丑陋的东西?
我将一个正则表达式放入 $/ 中,但它不起作用。哪里出错了?
如何在保留 RHS 中大小写的情况下,对 LHS 进行不区分大小写的替换?
如何让 \w
匹配国家字符集?
如何匹配 /[a-zA-Z]/
的区域设置智能版本?
如何引用变量以在正则表达式中使用?
/o
真正的作用是什么?
如何使用正则表达式从文件中剥离 C 样式注释?
我可以使用 Perl 正则表达式匹配平衡文本吗?
正则表达式贪婪是什么意思?我如何解决这个问题?
如何处理每一行中的每个单词?
如何打印出单词频率或行频率摘要?
如何进行近似匹配?
如何一次高效地匹配多个正则表达式?
为什么使用 \b
进行单词边界搜索对我不起作用?
为什么使用 $&、$` 或 $' 会使我的程序变慢?
正则表达式中的 \G
有什么用?
Perl 正则表达式是 DFA 还是 NFA?它们符合 POSIX 吗?
在 void 上下文中使用 grep 有什么问题?
如何匹配包含多字节字符的字符串?
如何匹配变量中的正则表达式?
本节处理通用 Perl 语言问题,这些问题显然不属于任何其他节。
我可以获得 Perl 语言的 BNF/yacc/RE 吗?
所有这些 $@%&* 标点符号是什么,我如何知道何时使用它们?
我是否总是/从不必须引用我的字符串或使用分号和逗号?
如何跳过一些返回值?
如何暂时阻止警告?
什么是扩展?
为什么 Perl 运算符的优先级与 C 运算符不同?
如何声明/创建结构?
如何创建模块?
如何采用或接管 CPAN 上已有的模块?
如何创建类?
如何判断变量是否已污染?
什么是闭包?
什么是变量自杀,我如何防止它?
如何传递/返回 {Function、FileHandle、Array、Hash、Method、Regex}?
如何创建静态变量?
动态作用域和词法作用域(静态)之间的区别是什么?local() 和 my() 之间呢?
如何在作用域中存在同名词法的同时访问动态变量?
深度绑定和浅层绑定之间的区别是什么?
为什么“my($foo) = <$fh>;”不起作用?
如何重新定义内置函数、运算符或方法?
以 &foo 和 foo() 调用函数有什么区别?
如何创建 switch 或 case 语句?
如何捕获对未定义变量、函数或方法的访问?
为什么无法找到包含在同一文件中方法?
如何找出我的当前或调用包?
如何注释掉一大段 Perl 代码?
如何清除包?
如何将变量用作变量名?
“错误的解释器”是什么意思?
当 C 库发生更改时,是否需要重新编译 XS 模块?
Perl FAQ 的此部分涵盖了涉及操作系统交互的问题。主题包括进程间通信 (IPC)、对用户界面(键盘、屏幕和指针设备)的控制,以及与数据操作无关的大多数其他内容。
如何找出我运行在哪个操作系统下?
为什么 exec() 不返回?
如何使用键盘/屏幕/鼠标执行花哨的操作?
如何以彩色打印内容?
如何在不等待回车键的情况下只读取一个键?
如何检查键盘上的输入是否就绪?
如何清除屏幕?
如何获取屏幕尺寸?
如何向用户询问密码?
如何读写串行端口?
如何解码加密的密码文件?
如何在后台启动进程?
如何捕获控制字符/信号?
如何在 Unix 系统上修改影子密码文件?
如何设置时间和日期?
如何在不到一秒的时间内 sleep() 或 alarm()?
如何在不到一秒的时间内测量时间?
如何执行 atexit() 或 setjmp()/longjmp()?(异常处理)
为什么我的套接字程序在 System V(Solaris)下不起作用?错误消息“不支持的协议”是什么意思?
如何从 Perl 调用我系统唯一的 C 函数?
我从哪里获取包含文件来执行 ioctl() 或 syscall()?
为什么 setuid perl 脚本会抱怨内核问题?
如何同时向命令打开和从命令打开管道?
为什么我无法使用 system() 获取命令的输出?
如何从外部命令捕获 STDERR?
为什么当管道打开失败时 open() 不会返回错误?
在空上下文中使用反引号有什么问题?
如何在不进行 shell 处理的情况下调用反引号?
为什么在我给出 EOF(Unix 上的 ^D,MS-DOS 上的 ^Z)后,我的脚本无法从 STDIN 读取?
如何将我的 shell 脚本转换为 perl?
我可以使用 perl 运行 telnet 或 ftp 会话吗?
如何在 Perl 中编写 expect?
有没有办法向“ps”等程序隐藏 perl 的命令行?
我在 perl 脚本中{更改目录,修改环境}。为什么当我退出脚本时更改消失了?如何让我的更改可见?
如何在不等待进程完成的情况下关闭进程的文件句柄?
如何派生守护进程?
如何找出我是否正在交互式运行?
如何对慢速事件设置超时?
如何设置 CPU 限制?
如何在 Unix 系统上避免僵尸进程?
如何使用 SQL 数据库?
如何让 system() 在按 Ctrl-C 时退出?
如何在不阻塞的情况下打开文件?
如何区分 shell 和 perl 的错误?
如何从 CPAN 安装模块?
require 和 use 有什么区别?
如何保留我自己的模块/库目录?
如何将我的程序所在的目录添加到模块/库搜索路径?
如何在运行时将目录添加到我的包含路径 (@INC)?
模块安装在哪里?
socket.ph 是什么,我从哪里可以获取它?
本节讨论与运行网站、发送和接收电子邮件以及一般网络相关的问题。
我应该使用 Web 框架吗?
我应该使用哪个 Web 框架?
Plack 和 PSGI 是什么?
如何从字符串中删除 HTML?
如何提取 URL?
如何获取 HTML 文件?
如何自动提交 HTML 表单?
如何在 Web 上对那些 %-编码进行解码或创建?
如何重定向到另一个页面?
如何在网页上设置密码?
如何确保用户无法在表单中输入导致我的 CGI 脚本执行不良操作的值?
如何解析邮件头?
如何检查有效的邮件地址?
如何解码 MIME/BASE64 字符串?
如何找到用户的邮件地址?
如何发送电子邮件?
如何使用 MIME 在邮件消息中添加附件?
如何阅读电子邮件?
如何找出我的主机名、域名或 IP 地址?
如何获取/放置 (S)FTP 文件?
如何在 Perl 中执行 RPC?
Tom Christiansen 编写了最初的 perlfaq,然后在 Nat Torkington 的帮助下对其进行了扩展。brian d foy 对 perlfaq 进行了大量编辑和扩展。多年来,perlfaq-workers 和其他人也提供了反馈、补丁和更正。
Tom Christiansen 编写了此文档的最初版本。brian d foy <[email protected]>
编写了此版本。有关其他版权信息,请参阅各个 perlfaq 文档。
此文档的适用条款与 Perl 本身相同。所有 perlfaq 文档中的代码示例均为公有领域。请根据需要使用它们(并自行承担风险,不提供任何人的担保)。