问题标签 [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.

0 投票
1 回答
204 浏览

postgresql - 如何继承 IO::Handle 以在没有文件或内存的情况下正确获取低级文件句柄?

我有一个访问 PostgreSQL 数据库的应用程序,需要根据一些需要的处理从中读取一些大型二进制数据。这可能是数百 MB 甚至几 GB 的数据。请不要讨论有关使用文件系统的讨论,这就是现在的方式。

该数据只是各种类型的文件,例如它可能是一个 Zip 容器或某种其他类型的存档。一些需要的处理是列出 Zip 的内容,甚至可能提取一些成员进行进一步处理,可能对存储的数据进行哈希处理......最后数据被读取多次,但只写入一次来存储它。

我使用的所有 Perl 库都能够使用文件句柄,一些使用IO::Handle,另一些使用IO::Stringor IO::Scalar,还有一些仅使用低级文件句柄。所以我所做的是创建一个子类,IO::HandleIO::Seekable的作用类似于DBD::Pg. 在 CTOR 中,我创建了一个到数据库的连接,打开一些提供的 LOID 用于读取并将 Postgres 提供的句柄存储在实例中。然后将我自己的句柄对象转发给能够使用此类文件句柄并可以直接在 Postgres 提供的 blob 中读取和查找的任何人。

问题是使用低级文件句柄或低级文件句柄操作的库IO::HandleDigest::MD5似乎是一个,Archive::Zip另一个。Digest::MD5 croaks 并告诉我没有提供句柄,Archive::Zip另一方面尝试从我的创建一个新的自己的句柄,IO::Handle::fdopen在我的情况下调用并失败。

我想问题是句柄的低级副本,它删除了我自己的实例,因此不再有实例具有我的数据库连接和所有这些东西。

那么,在我的情况下,是否有可能提供一些IO::Handle可以成功用于需要低级文件句柄的地方?

我的意思是,我没有真正的文件句柄,我只有一个对象,其中方法调用被包装到它们相应的 Postgres 方法中,为此需要数据库句柄等。所有这些数据都需要存储在某个地方,需要完成包装等。

我试图做其他人正在做的事情,例如IO::String,它还使用tie了例如。但最终那个用例是不同的,因为 Perl 能够自己为某些内部存储器创建一个真正的低级文件句柄。在我的情况下根本不支持的东西。我需要保留我的实例,因为只有它知道数据库的句柄等。

IO::Handle像通过调用方法一样使用我的句柄read,这样的工作就像预期的那样,但我想更进一步,并且更兼容那些不希望在IO::Handle对象上工作的人。很像IO::StringFile::Temp可以用作低级文件句柄。

0 投票
0 回答
109 浏览

c - 在 C 中嵌入 perl,perlapio - 与 STDIO 的互操作性

我刚刚意识到,PerlIO 层似乎不仅仅(或多或少)轻松地包装了 stdio.h 函数。PerlIO_stdout()如果我尝试使用通过 stdio.h中的函数解析的文件描述符PerlIO_fileno(),则会失败。

例如:

我已经用 VC10 试过了。嵌入的 perl 程序是从不同的上下文中执行的——因此不可能从执行 relocatedStdErr 写入的上下文中使用 PerlIO。

对于好奇的人:我需要执行一个 perl 脚本并将脚本的 stdout/stderr 的输出转发到日志,同时保持自己在 stdout 上写入的能力。此外,这应该独立于平台(Linux、Windows 控制台应用程序、win32 桌面应用程序)。只是转发 stdout/stderr 在 Win32 桌面应用程序中不起作用,因为没有;) - 您需要使用 perl 的 stdout/stderr。

需要的解决方案:能够在不使用 PerlIO 堆栈的 perlio 派生的文件句柄(或描述符)上进行写入。

编辑 - 我的解决方案:

当 Story Teller 指向 PerlIO_findFILE 时,这就成功了。所以这里是代码的摘录 - 请参阅里面的评论以获取描述:

我实际上不明白的一件有趣的事情是,perl 文档说不需要#define PERLIO_NOT_STDIO 0能够使用PerlIO_findFILE(). 但对我来说,没有它就可以正常工作,而且我更喜欢将 PerlIO 和 stdio 一起使用。这一点我没有弄清楚发生了什么。

0 投票
1 回答
321 浏览

c - perlapio - PerlIO_findFILE() 有效,但将 errno 设置为“非法搜索”(ESPIPE 29)

这个问题或多或少与C 中的嵌入式 perl perlapio 有关 -我认为我已经为 Windows 环境解决了与 STDIO 的互操作性。如果这个新问题也得到解决,我将发布一个完整的解决方案。

在链接的问题中, StoryTeller 给了我 使用PerlIO_findFILE()解决直接问题的提示,但是 Linux 上的相同代码表现得很奇怪。

Perldup2()在 Win32 上似乎有不同的行为,其中dup2()是一个宏 for win32_dup2(),据我所知,它只是使用dup2()from io.h

在 Win32 上,Perl 的版本在成功时返回零,在错误时返回非零,但在 Linux 上,dup2()将使用默认的 ANSI,而是返回新的文件描述符。然后,我将不得不检查errno一切是否正常。

如果调用PerlIO_findFILE()设置errno为“非法搜索”(errno 29 - ESPIPE),那么 after dupdup2等仍然设置为“非法搜索”,并且任何进一步的检查仍然会看到相同的错误pipeerrnoerrno

(实际上,一切都对我有用,因为没有实际错误。此外,通过检查的解决方案errno不是线程安全的,因为在系统调用和检查之间,另一个线程可能会重置 errno。)

请注意,我有

实际上,我正在使用 Perl5.14.1。

我在这里做错了什么吗?

这是一个简化的代码片段:

0 投票
1 回答
861 浏览

perl - 从 Unix 域套接字中读取一行

我有一个socat使用以下命令运行的服务器:

我可以打开一个到该服务器的套接字,发送一行,读取一行,然后使用以下代码打印它:

但是,当我用以下内容替换最后 5 行时,程序挂起:

操作员不<FILEHANDLE>应该从句柄中读取一行吗?为什么我不能读取一行并打印它?

0 投票
1 回答
70 浏览

perl - 确定 perl 标量最初是否有一个或两个反斜杠

我有从网络服务获得的数据。数据中包含 \\ 是有效的。数据中包含单个 \ 也是有效的。考虑以下对我的 perl 程序的有效数据输入。我不确定如何确定哪些数据最初具有单个 \ 与双 \\。

请注意,上面代码中 $data 和 $data2 的唯一区别是 $data2 有一个额外的反斜杠。我也不想逃避反斜杠。反斜杠只是此数据流中的有效数据。两者都可以,并且发生在我的数据中。

调试会话:

因此,即使我的输入不同,perl 仍将它们视为相同的数据,因为 \\ 是标量中的单个反斜杠,\ 也是如此。在赋值语句之后,对我来说似乎结束了。无论数据是否有 \\ 或 \,我都丢失了。

似乎 perlio 层在某种程度上通过在反斜杠变为标量之前转义来处理这个问题?对于进入我的程序的数据,我不确定我在哪里正确地转义 \。

数据从 HTTP 服务通过 LWP::UserAgent 流向一些 perl 类,这些类最终出现在我的程序中。有没有办法在我的数据中处理这个 \\ vs \ 后得到一个标量?

编辑

经过 ikegami 的进一步研究和投入,我意识到这个问题现在很愚蠢,我对 perl 中反斜杠的转义如何发生感到困惑。任何接受输入的东西都会转义反斜杠,以便可以在 perl 中正确表示。在我的情况下,我在数据路径上丢失了一些对我来说并不明显的反斜杠。

就我而言,我必须通过 json_decode 重新转义反斜杠。

鉴于最初的问题很愚蠢,而且我们现在处于非常具体的领域,我会结束这个问题。

谢谢。

0 投票
1 回答
253 浏览

windows - 程序因文件名中的变音符号而死

我希望你能帮助我,我找不到我的代码停止的原因。我会感谢每一次改进,我必须使用 Perl,而我以前从未这样做过!我还必须在 Windows 文件系统上工作。

错误:

无法打开文件 '' 在 C:\Users\schacherl\Documents\perl\tester.pl 第 29 行第 1 行没有这样的文件或目录。

仅供参考:FILElog.txt 文件包含子文件夹,如

“vps_bayern_justiz_15027148042584275712825768716427”

EDALOG 包含指向 EDA 文件的完全限定链接

"W:\EGVP\manuelle Nachrichten\heruntergeladene_DONE\EGVP_GP114503661816195610088017045919978\attachments\Staßfurt_AIA100.eda"

在程序上方的这个确切文件处死亡。到目前为止,对于所有其他人来说,它似乎都可以工作,只是那些看起来无法处理的“Staßfurt”文件。如果我像第一个一样用 UTF-8 对其他文件进行编码,我会得到很多

UTF-8 "\x84" 不映射到 C:\Users\zhengphor\Documents\perl\tester.pl 第 32 行第 4 行的 Unicode。

UTF-8 "\x81" 不映射到 C:\Users\zhengpor\Documents\perl\tester.pl 第 32 行第 4 行的 Unicode。

如果我没有 Staßfurt 文件,它可以正常工作。这只是发生错误的部分,我已经排除了 $returner 变量的整个处理。

我真的很感激!我找不到 Staßfurt 文件出现此错误的原因。

0 投票
2 回答
182 浏览

perl - 尝试使用 perl 在命令提示符下打开位于 D 驱动器中的文件

我正在尝试学习 Perl 中的文件处理,我想以读取模式打开位于 Windows 终端上 D: 驱动器中的 .txt 文件,因此我使用的代码如下:

它总是显示

无法打开文件 pay_info.txt,在 C:\perl\perl2.pl 第 1 行没有这样的文件或目录。

这是什么意思?

0 投票
1 回答
203 浏览

perl - Perl Config::Tiny->read() 不处理 CRLF

我在 Windows 10 下将 Perl 与 Ubuntu 一起使用。我想使用 Perl Config::Tiny 模块来读取文件名和其他配置数据。当我在 Linux 中读取在 Windows 下创建的配置文件时,它会将回车符留在值的末尾。我目前通过在 Linux 下制作配置文件的临时副本来解决这个问题。

有没有办法告诉 Config::Tiny->read() 打开配置文件并进行我想要的行尾处理?

这是我当前代码的片段:

0 投票
1 回答
77 浏览

perl - perl open() 总是返回 sh 的 PID 而不是底层程序

我必须杀死一个我通过它打开的程序

$pid = open(FH, "program|")

或者

$pid = or open(FH, "-|", "program")

但是,程序(具体来说是 mosquittto_sub)仍然在后台徘徊,因为open它正在返回 perl 用来运行程序的 PID sh,所以我只是杀死了sh包装程序而不是实际程序。

有没有办法让程序真正的PID?获取sh的 PID 有什么意义?