13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

你 可 以 不 停 地 重 复 使 用 这 个 技 巧 , 而 且 在 你 的 输 出 流 上 放 你 希 望 的 任 意 多 的 过 滤 器 。 只 要 不停 调 用 那 个 分 裂 打 开 STDOUT 的 函 数 , 并 且 让 子 进 程 从 它 的 父 进 程 ( 它 认 为 是 STDIN)里 读 取 数 据 , 然 后 把 消 息 输 出 给 流 里 面 的 下 一 个 函 数 。这 种 利 用 分 裂 后 打 开 文 件 的 自 言 自 语 的 另 外 一 个 有 趣 的 应 用 是 从 一 个 糟 糕 的 函 数 中 捕 获 输出 , 那 些 函 数 总 是 把 它 们 的 结 果 输 出 到 STDOUT。 假 设 <strong>Perl</strong> 只 有 printf 但 是 没 有sprintf。 那 么 你 需 要 的 就 是 类 似 反 钩 号 那 样 的 东 西 , 但 却 是 <strong>Perl</strong> 的 函 数 , 而 不 是 外 部 命令 :badfunc("arg"); # TMD, 跑 !$string = forksub(\&badfunc, "arg");@lines = forksub(\&badfunc, "arg");# 把 它 当 作 字 串 捕 获# 当 作 独 立 的 行sub forksub {my $kidpid = open my $self, "-|";defined $kidpid or die "cannot fork: $!";shift->(@_), exitunless $kidpid;local $/unless wantarray;return ;# 当 退 出 范 围 的 时 候 关 闭}我 们 不 能 说 这 么 做 最 好 , 一 个 捆 绑 的 文 件 句 柄 可 能 更 快 一 点 。 但 是 如 果 你 比 你 的 计 算 机 更 着急 , 那 么 这 个 方 法 更 容 易 写 代 码 。16.3.3 双 向 通 讯尽 管 在 单 向 通 讯 中 , 用 open 与 另 外 一 条 命 令 通 过 管 道 运 转 得 很 好 , 但 是 双 向 通 讯 该 怎 么办 ? 下 面 这 种 方 法 实 际 上 行 不 通 :open(PROG_TO_READ_AND_WRITE, "| some program |") # 错 !而 且 如 果 你 忘 记 打 开 警 告 , 那 么 你 就 会 完 全 错 过 诊 断 信 息 :Can't do bidirectional pipe at myprog line 3.431

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!