问题标签 [perl-io]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - 我可以得到一个句柄 - 来源吗?
看起来 main 中有一个符号被称为'_<-'
(不带引号),其方式与其他看起来可能是句柄的事物相同:'_</usr/perl/lib/Carp.pm'
例如。
有什么方法可以使用它吗?
或者如果我希望读取输入源,我是否必须使用源过滤器?
回复暴民:我不知道调试会在哪里打开。在我转储基表后,%INC 转储显示:
perl - 为什么这个返回 PerlIO* 的 XS 代码会泄漏?
我正在尝试编写一些 XS 代码,将库作为可以写入的流接口公开给 Perl 代码。下面的
get_stream
函数应该是一个构造函数,它准备并返回一个 PerlIO 对象。我认为我只需要
Write
andClose
方法,所以我将所有其他函数槽留空。
当我像这样使用提供的界面时......
...mylib_write
函数被调用,所以到目前为止我还没有完全搞砸。(我通过插入调试 printf 语句验证了这一点。)但是,我希望 PerlIO 对象在
$fh
超出范围时关闭,就像使用open
. 但目前,该mylib_close
函数仅在解释器关闭期间调用。
直接调用close
工作正常,设置$fh
为undef
不行。
更新:按照 ikegami 的建议,我使用Devel::Peek::Dump
并sv_dump
发现句柄返回get_stream
函数是一个“RV”,它指向一个SV = PVGV(...)
. glob ( PVGV
) 的引用计数器设置为 3,这似乎不正确。
我添加了
治愈症状:
在块结束时超出范围时close
调用该函数。$fh
但是我仍然不太了解潜在的问题。
这是为该OUTPUT
部分生成的 C 代码:
GV 的引用计数如何最终达到 3?
perl - IO::Handle 获取和取消获取 unicode 字符
我想我遇到了 Unicode 和 IO::Handle 的问题。我很可能做错了什么。我想从 IO::Handle 获取和取消获取单个 unicode 字符(不是字节)。但我遇到了一个令人惊讶的错误。
来自 ungetc() 行的错误消息是“在 unicode.pl 第 21 行中说的格式错误的 UTF-8 字符(字符串的意外结尾)。” \x{00c5}
“未映射到 unicode.pl 第 21 行的 utf8。” 但这是字符的正确十六进制,它应该映射到字符。
我使用十六进制编辑器来确保 A-RING 的字节对于 UTF-8 是正确的。
这似乎是任何两字节字符的问题。
最后的输出'\xC5'(字面意思是四个字符:反斜杠,x,C,5)。
我已经通过从文件而不是标量变量中读取来测试了这一点。结果是一样的。
这是为 darwin-2level 构建的 perl 5,版本 16,subversion 2 (v5.16.2)
并且脚本以 UTF-8 保存。这是我检查的第一件事。
perl - Perl 的 IO::File 并使用 open qw(:utf8)
IO::File->open() 似乎不尊重在以下程序中使用 open() ,这对我来说很奇怪,并且似乎违反了文档。或者也许我做错了。重写我的代码以不使用 IO::File 应该不难。
我希望输出是
但我收到此错误:“糟糕:./run.pl 第 33 行的打印中格式错误的 UTF-8 字符(字符串的意外结尾)。”
这对我来说似乎根本不对。
perl - 使用 Perl XS 和 PerlIO 使旧库工作
我是一个 XS 初学者,我正在考虑更改现有的 XS 模块,该模块大量使用 15 年以上的底层 C 库(实际上该模块基本上只是粘到这个库)。问题是我希望能够使用 PerlIO 字符串技巧,例如:
然后传递$fh
到库所期望的 XS 胶水FILE
。问题是 XS 有:
我认为它需要是:
这当然行不通,因为它必须有更多的东西。当我查看_parse
库中的代码时,结果如下:
再次与FILE
类型。现在我必须开始的基本问题是 - 在不改变库的情况下这是否可能?也就是说,我可以通过更改 XS 从字符串 PerlIO 行为中获取伪文件句柄吗?
perl - 从 IO::File 获取异常?
与直接使用 perl 的内置 IO 函数相比,IO::File、IO::Socket::INET 模块具有一些优势,例如具有显式语法来刷新句柄。
但是,它们似乎比内置的 IO 功能有一些缺点。例如,据我所知,它们不能与 autodie 模块结合使用以引发故障异常,因此我发现自己必须编写更多样板代码来处理故障,而不是使用内置函数。
有没有办法将两者结合起来,或者其他一些具有结合功能的模块?我注意到一些用途有限的 IO 模块,例如 File::Slurp,确实允许更灵活的错误处理。
我正在编写模块代码,理想情况下,该解决方案应该可以一直追溯到 perl 5.10.0。
regex - 从perl的文件夹和子文件夹中复制所有文件?
我想从所有文件夹和子文件夹中复制文本文件并将其保存在不同的位置。我写了代码,但它不起作用。它无法识别子文件夹。它读取文本,但无法识别它是文件还是文件夹。
代码
perl - FTP + 解压缩 + 读取线
我想从大型(3+ GB,gzipped)FTP 下载中提取一些数据,并即时执行此操作,以避免转储然后完全下载到我的磁盘上。
要提取所需的数据,我需要逐行检查未压缩的流。
所以我正在寻找道德等价物
FWIW:我知道如何打开一个读取句柄ftp://ftp.foobar.com/path/to/blotto.txt.gz
(with Net::FTP::repr
),但我还没有弄清楚如何向:gzip
这个打开的句柄添加一个层。
我花了比找到上述问题答案的时间更长的时间,所以我想我会把它发布给下一个需要它的人。
perl - 监控外部进程:当 STDOUT 匹配模式时退出
我正在运行系统命令并等待与特定模式匹配的输出,例如:
这将打印line 1
并离开循环,但在外部命令完成之前不会退出。
如何让脚本在匹配所需的输出后立即退出?
utf-8 - 在 Perl 中使用带有标量和 I/O 层的 open() 时编码的不确定性
几个小时以来,我一直在与我的 Perl 程序中的一个错误作斗争。我不确定是我做错了什么还是解释器做错了,但是代码是非确定性的,而它应该是确定性的,IMO。它还在古老的 Debian Lenny (Perl 5.10.0) 和刚刚升级到 Debian Wheezy (Perl 5.14.2) 的服务器上表现出相同的行为。它归结为这段 Perl 代码:
它以启用警告的严格模式初始化 Perl 5 解释器,使用字符串(而不是字节字符串)和以 UTF8 编码的命名标准流(UTF-8 的内部概念,但非常接近;更改为完整的 UTF-8 没有区别)。然后它打开一个“内存文件”(标量变量)的文件句柄,在其中打印一个单字节 UTF-8 字符并在关闭时检查该变量。
标量变量现在总是关闭 UTF8 位。然而,它有时包含一个字节字符串(通过 转换为字符串utf8::decode()
),有时包含一个只需要在其 UTF8 位 ( Encode::_utf8_on()
) 上翻转的字符串。
当我重复执行我的代码(1000 次,通过 Bash)时,它会Undecoded
以Decoded
大致相同的频率打印。当我更改写入“文件”的字符串时,例如在其末尾添加一个换行符,就会Undecoded
消失。当utf8::decode
成功并且我在循环中尝试相同的原始字符串时,它会在同一个解释器实例中保持成功;但是,如果失败,它会继续失败。
观察到的行为的解释是什么?如何将标量变量的文件句柄与字符串一起使用?
巴什游乐场:
作为参考和绝对肯定,我还制作了一个带有迂腐错误处理的版本——结果相同。