13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

or die "can't fork: $!";while () {next if /^(tcp|udp)/;print;}close STATUS or die "bad netstat: $! $?";你 同 样 也 可 以 象 用 在 输 出 里 那 样 , 打 开 一 个 多 命 令 的 输 入 管 道 。 而 且 和 以 前 一 样 , 你 可 以 通过 使 用 一 个 可 选 的 open 形 式 避 免 shell:open STATUS, "-|", "netstat", "-an" # 需 要 5.6.1or die "can't runnetstat: $!";不 过 那 样 你 就 得 不 到 I/O 重 定 向 , 通 配 符 扩 展 或 者 多 命 令 管 道 , 因 为 <strong>Perl</strong> 得 靠 你 的 shell做 这 些 事 情 。你 可 能 已 经 注 意 到 你 可 以 使 用 反 钩 号 实 现 与 打 开 一 个 管 道 读 取 数 据 一 样 的 功 能 :print grep { !/^(tcp|udp)/ } `netstat -an 2>&1`;die "bad netstat" if $?;尽 管 反 钩 号 很 方 便 , 但 是 它 们 必 须 把 所 有 东 西 都 一 次 读 进 内 存 , 所 以 , 通 常 你 打 开 自 己 的 管道 文 件 句 柄 然 后 每 次 一 行 或 者 一 条 记 录 地 处 理 文 件 会 更 有 效 些 。 这 样 你 就 能 对 整 个 操 作 有 更好 的 控 制 , 让 你 可 以 提 前 杀 死 进 程 。 你 甚 至 还 可 以 一 边 接 收 输 入 一 边 处 理 , 这 样 效 率 更 高 ,因 为 当 有 两 个 或 者 更 多 进 程 同 时 运 行 的 时 候 , 计 算 机 可 以 插 入 许 多 操 作 。( 即 使 在 一 台 单CPU 的 机 器 上 , 输 入 和 输 出 也 可 能 在 CPU 处 理 其 他 什 么 事 的 时 候 发 生 。)因 为 你 正 在 并 行 运 行 两 个 或 者 更 多 进 程 , 那 么 在 open 和 close 之 间 的 任 何 时 刻 , 子 进 程都 有 可 能 遭 受 灾 难 。 这 意 味 着 父 进 程 必 须 检 查 open 和 close 两 个 的 返 回 值 。 只 检 查open 是 不 够 安 全 的 , 因 为 它 只 告 诉 你 进 程 分 裂 是 否 成 功 , 以 及 ( 可 能 还 有 ) 随 后 的 命 令 是否 成 功 启 动 ( 只 有 在 最 近 的 版 本 的 <strong>Perl</strong> 中 才 能 做 到 这 一 点 , 而 且 该 命 令 还 必 须 是 通 过 直 接分 裂 的 子 进 程 执 行 的 , 而 不 是 通 过 shell 执 行 的 )。 任 何 在 那 以 后 的 灾 难 都 是 从 子 进 程 向 父进 程 以 非 零 退 出 状 态 返 回 的 。 当 close 函 数 看 到 这 个 返 回 值 , 那 么 它 就 知 道 要 返 回 一 个 假值 。 表 明 实 际 的 状 态 应 该 从 $?($CHILD_ERROR) 变 量 里 读 取 。 因 此 检 查 close 的 返 回值 和 检 查 open 的 返 回 值 一 样 重 要 , 如 果 你 往 一 个 管 道 里 写 数 据 , 那 么 你 还 应 该 准 备 处 理427

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

Saved successfully!

Ooh no, something went wrong!