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.

般 的 把 所 有 你 在 命 令 行 上 提 到 的 所 有 文 件 的 所 有 数 据 行 都 交 给 你 。 如 果 你 没 有 ( 在 命 令 行 )上 声 明 文 件 , 它 就 把 标 准 输 入 交 给 你 , 这 样 你 的 程 序 就 可 以 很 容 易 地 插 入 到 一 个 管 道 或 者 一个 进 程 中 。下 面 是 其 工 作 原 理 的 说 明 : 当 第 一 次 计 算 时 , 先 检 查 @ARGV 数 组 , 如 果 它 是 空(null), 则 $ARGV[0] 设 置 为 “-”, 这 样 当 你 打 开 它 的 时 候 就 是 标 准 输 入 。 然 后 @ARGV数 组 被 当 作 一 个 文 件 名 列 表 处 理 。 更 明 确 地 说 , 下 面 循 环 :while () { ... # 处 理 每 行 的 代 码 }等 效 于 下 面 的 类 <strong>Perl</strong> 的 伪 代 码 :@ARGV = ('-') unless @ARGV; # 若 为 空 则 假 设 为 STDINwhile( @ARGV) {$ARGV = shift @ARGV;# 每 次 缩 短 @ARGVif( !open(ARGV, $ARGV)) {warn "Can't open $ARGV: $!\n";next;}while () {... # 处 理 每 行 的 代 码}}第 一 段 代 码 除 了 没 有 那 么 唠 叨 以 外 , 实 际 上 是 一 样 的 。 它 实 际 上 也 移 动 @ARGV, 然 后 把当 前 文 件 名 放 到 全 局 变 量 $ARGV 里 面 。 它 也 在 内 部 使 用 了 特 殊 的 文 件 句 柄ARGV—— 只 是 更 明 确 的 写 法 ( 也 是 一 个 特 殊 文 件 句 柄 ) 的 一 个 同 义 词 ,( 上面 的 伪 代 码 不 能 运 行 , 因 为 它 把 当 作 一 个 普 通 句 柄 使 用 。)你 可 以 在 第 一 个 语 句 之 前 修 改 @ARGV, 直 到 数 组 最 后 包 含 你 真 正 需 要 的 文 件 名 列 表为 止 。 因 为 <strong>Perl</strong> 在 这 里 使 用 普 通 的 open 函 数 , 所 以 如 果 碰 到 一 个 “-” 的 文 件 名 , 就 会 把它 当 作 标 准 输 入 , 而 其 他 更 深 奥 的 open 特 性 是 是 <strong>Perl</strong> 自 动 提 供 给 你 的 ( 比 如 打 开 一 个名 字 是 “gzip -dc

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

Saved successfully!

Ooh no, something went wrong!