搜档网
当前位置:搜档网 › a2p__Linux命令讲解手册

a2p__Linux命令讲解手册

Content-type: text/html
A2P
Section: Perl Programmers Reference Guide (1)
Updated: perl 5.005, patch 03
Index Return to Main Contents
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

NAME
a2p - Awk 到 Perl 翻译器
总览 (SYNOPSIS)
a2p [options] filename
描述 (DESCRIPTION)
A2p 从命令行或标准输入取得一个awk脚本文件,并且向标准输出产生一个相同功能的
perl 脚本文件。
选项 (OPTIONS)
可选选项有:
-D
设置调试标记。
-F
告诉a2p,awk脚本总是带 -F 选项执行。
-n
如果输入不分解为一个数组,你需要指定输入的各字段的名称。假如要翻译一个用于
处理密码文件的awk脚本,你应当这样:
a2p -7 -nlogin.password.uid.gid.gcos.shell.home
任何定界符都可以用来分隔字段名。
-
使得a2p总是假设输入包含那么多字段。
-o 告诉a2p使用旧的awk行为。当前,唯一的区别是旧的awk总是有一个每行的循环,即使
没有对每行的操作;新的awk不是这样。

Considerations
a2p 不能翻译得像人一样好,但是通常都做得很好。在生成的perl脚本中,你应当检查和
修改一些东西。这里是其中的一些,没有顺序。
awk 中有一个习惯,就是将一个字符串表达式放在 int() 函数中来使它强制解释为数字,
即使参数已经是一个数字。这在perl 中是不必要的,但是a2p不知道参数是不是一个数字
,所以它将它直译了。你也许想删掉它。
perl 中数字比较和字符比较是不一样的。对这两种情况,awk只有一个操作符,但是会在
运行时判断是哪一种。在这一点上a2p不对awk进行彻底的模拟。它会猜测哪一种是你想要
的。大多数时候它是对的,但是不能保证。这样的猜测都以 ""#???"" 注释来标记。你应
当仔细检查它们,至少用perl的 -w 选项来运行它们一次,这样 perl会警告你在应当使用
eq 的地方使用了==。
perl 不会像awk一样将不存在的数组元素创建为引用。如果你想用这种办法来在一个
for...in 循环中创建空元素,在perl中将不可能实现。
如果a2p产生了一个分段的行,用来将一列变量赋值,看上去就像这样 (Fld1, Fld2,
Fld3...) ,你应当重新用上面提到的 -n 选项运行a2p。这样可以让你命名字段。如果它
又将行分解为一个数组,那么这个脚本中其他地方可能引用了字段的数量。
awk中的exit语句不会退出。如果有 END 段,它会转到那里。在 END 段中执行跳过其他程
序,转向退出的awk脚本段落在perl 中没有必要。你只要删掉 END 块中的条件变量,直接
退出就可以了。
perl 中

有两种数组,数字下标的和关联数组。perl中的关联数组叫做散列 "hashes"。awk
中的数组总是翻译为散列,但是如果你知道索引总是数字,你就可以将 {...} 转为 [...]
。对散列的遍历用到了 keys() 函数,但是对数组的散列不会。你需要修改对这样的数组
进行遍历的循环。
awk 默认 OFMT 的值是 %.6g,perl默认作用相同的成分 $# 的值是 %.20g。如果你想使用
OFMT 的默认值,你需要显式地定义$#。
在循环顶部总是会出现分支操作,这是awk脚本中暗含的。很多时候你可以将对整个记录的
判断移到循环下面,这样可以减少很多分支判断。
出于美学原因,你也许想将数组的起始值 $[ 从1转为perl默认的0 但是要记住将所有数组
的下标 AND 和 substr() 还有 index() 函数都进行更改,保证正确。
a2p会聪明地在在未处理的脚本中添加注释 "# Here is a workaround because awk is
dumb"
awk脚本经常使用在shell脚本中,通过管道接受和输出文本。大部分时候这种shell脚本
"wrapper"可以和perl合并,因为perl可以建立输入输出管道,做其他awk不能做的事情。
对RSTART 和 RLENGTH 变量进行引用的脚本可以简单地修改为对变量$`, $& 和 $' 的引用
,只要他们是在模式匹配的范围之内。
产生的perl脚本可能含有子程序来处理awk的getline和print函数。由于 a2p通常将正确性
放在首位而不是效率,一般可以将子程序重写得更有效率。
为了提高效率,你可以将子程序中的return去掉,只要返回值是子程序中的最后一个语句
。a2p可以处理最简单的情况,但是不能分析嵌入程序块的情况。
ARGV[0] 翻译为 $ARGV0,但是 ARGV[n] 会翻译为 $ARGV[$n]。遍历 ARGV[0] 的循环将找
不到它。
环境 (ENVIRONMENT)
a2p不使用环境变量
作者 (AUTHORS)
Larry Wall
文件 (FILE)

另见 (SEE ALSO)
perl perl 编译器和解释器
s2p sed 到 perl的翻译工具
诊断 (DIAGNOSTICS)

BUGS
可以在运行时根据操作数来选择字符还是数字操作,从而模拟awk。但是这样非常粗野并且
无效率。另外,a2p通常都能猜对。
当前,awk语法树是静态存储的,空间可能会耗尽。
[中文版维护人]
袁乙钧
[中文版最新更新]
2003/10/25
《中国Linux论坛man手册页翻译计划》
https://www.sodocs.net/doc/557245638.html,
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Index
NAME
总览 (SYNOPSIS)
描述 (DESCRIPTION)
选项 (OPTIONS)
Considerations
环境 (ENVIRONMENT)
作者 (AUTHORS)
文件 (FILE)
另见 (SEE ALSO)
诊断 (DIAGNOSTICS)
BUGS
[中文版维护人]
[中文版最新更新]
《中国Linux

论坛man手册页翻译计划》
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
This document was created by man2html, using the manual pages.
Time: 07:05:45 GMT, April 06, 2011

相关主题