这是命令 makepp_builtins 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
makepp_builtins -- makepp 中的内置命令
商品描述
A: AWK, C: &猫,
chgrp,
&chmod,
乔恩,
&cp,
CPP,
&切, D: 日期, E: &回声,
&expr, F: false,
fmt, G: &grep, H: 头, I: &安装, L: &ln, M: m4,
&mkdir,
&mv, P: &perl,
&预处理,
&printf, R: &R M,
命令rmdir, S: &sed,
&种类, T: 尾巴,
&模板,
&触碰,
tr, U: &卸载,
&uniq, Y: &是的
有一种特殊的类似 Shell 的可能性来调用规则中的内置命令。 唯一的
识别的元字符是注释符号、反斜杠、单引号和双引号。 仅有的
每行可以给出一个命令,并且 I/O 重定向不可用(请参阅“-i”和“-o”
下面代替)。
这些命令以“&”开头,它是 Perl 中的函数字符,不是有效的
Shell 中的第一个字符。 如果找不到该名称的内置命令,这也是
在执行规则的 Perl 实例中调用外部脚本的语法。
见“跑”。
这些命令以及您自定义的命令和 Perl 脚本也可以称为
make 函数,返回标准输出。 这需要为 PerlIO 构建 perl。
换行符被转换为空格,除非在“define”语句中计算。
第一个词 ;= $(&cut -d' ' -f0 $(FILES))
当这些命令没有缩进为规则操作时,它们会在读取
生成文件。 您还可以独立访问这些命令,例如,如果您需要某些功能
通过 makeppbuiltin 命令,在 Unix 版本中不可用。
这些命令主要基于 GNU 变体。 但是很多选项(比如 --backup,
--interactive 或 --recursive) 在 makefile 中没有意义。 所以,即使
它们很容易在 Perl 中实现,但它们被排除在外。 还有很多Unix命令
提供涵盖相当复杂情况的各种选项(例如排序字段
规格),同时仍然受到内在的限制。 允许访问 Perl,即
无论如何,现在在这里提供了更多的力量。
文件名列表可能为空,因此可以安全地使用未选中的命令调用这些命令
列表。 简短形式的选项可以像“-ab”而不是“-a -b”那样粘合在一起。
在长形式中,参数可以用“=”符号粘在一起或单独给出。
简而言之,它们可以直接粘贴或单独粘贴。
标准版 选项
一些选项对于几个内置函数是通用的,尽管简短形式有时被隐藏
命令自己的选项(如“&cut -f”):
-A 文件名
--args-文件=文件名
--参数文件=文件名
读取文件并将其解析为可能引用的空格和/或换行符分隔
选项。
-f
- 力量
强制创建参数想要的文件,即使是不同的类型
该名称的文件或空目录已存在。 这必须在“-o,
--output=filename" 选项,如果它对此有任何影响。
-i shell命令
--inpipe=shell命令
启动 Shell 命令并将输出通过管道传输到内置命令中。 可以选择
是一个尾随的“|” 字符,表示这是一个管道。 使用此选项没有
需要给出文件名。 但是如果你想对两个文件和
管道输出,您必须使用“-”作为管道输出的文件名。 管道是
清空了,但是,除非您还给出“--infail”,否则不会等待该命令,因此它
可以并行终止。 此选项是必需的,因为没有重定向
语法。
-I
--失败
如果“--inpipe”Shell 命令失败,也会导致当前内置命令失败。
这目前不适用于 Strawberry 和 Win ActiveState,因为
他们半心半意地模仿 Unix fork/exec。 不过 Cygwin 做对了。
-o 文件名
--输出=文件名
将输出写入此文件,而不是 stdout。 文件名可能有这些
形式:
文件名
>文件名
只需写入文件。
>>文件名
附加到(不一定)现有文件。
+<文件名
同时打开文件进行输入,允许就地编辑。 使用此选项变体
不需要给出输入文件名。 但是如果你想执行内置
更多文件,您必须使用“-”作为此文件的输入文件名。 事实上
输出被写入一个临时文件,该文件最后被移动到文件名。
|shell命令
将内置命令的输出通过管道传送到 Shell 命令。
此选项是必需的,因为没有重定向语法。
-O
--失败
如果“--output”Shell 命令失败,也会导致当前内置命令失败。
-r 数
--记录大小=数
在本地为当前内置设置 $/ 。 这将输入拆分为长度记录
数 而不是一行一行。 如果 数 为零,每个输入文件作为一个整体是一
记录。
-s 绳子
--分隔符=绳子
在本地为当前内置设置 $/ 。 这将输入拆分为 绳子 而不是线
按行。
-S
--同步线
生成“#line”“没有”" ""“文件”""" 和 "#line "“没有” 行,被许多类似 C 的人理解
语言。
-v
--详细
记录对文件系统的更改。 如果要这样做,这必须在其他选项之前
记录它们的效果。 如果您将此选项传递给 makepp 本身,就好像您有
为每个内置命令提供它。
内建 命令
在 makepp 中使用内置命令有两个动机。 首先是提供一个
一组实用程序,与 Shell 命令不同,它们保证工作相同
无处不在,例如“&echo -n”或“&mkdir -p”,并为您省去寻找路径的麻烦
安装并找出其千差万别的选项。 在编译环境中,
拥有“--synclines”选项很有用,通常只有“m4”提供,在所有
过滤器。
另一个是效率问题。 一般来说,应该避免昂贵的 fork/execs
在合理可能的情况下。 在像 Cygwin 或 BS2000/Posix 这样的 Unix 模拟上,这变成了
明显的胜利。 但是,即使在 Linux 上,当 makepp 测试套件从
内置命令的外部命令,总体上节省了 3% 的用户 CPU 使用率和 15%
系统 CPU 使用率。 (这些测试当然对原始动作很重,几乎不调用
编译器。)
一致性也是一个问题,尽管我们不打算改革 Unix。 通常命令
有正则表达式的各种细微差别。 许多人发明了某种语言,每一种
不同的当然,做某事(例如“expr”,“sed”...),或复杂的选项
指定字段、分隔符、列(例如“剪切”、“排序”...)。
在这里,任何花哨的东西都简单地由 Perl 处理,从而使两者保持一致
所有命令,而且比一大堆选项更强大。 更好的是,任何 代码
这些命令为您运行,在 Makefile 的包中运行。 所以,而不是
将 Perl 代码填充到规则动作中,您可以定义函数和变量并使用它们
在命令中:
子 my_filter {
# 如果 $_ 是可取的,则返回 true
}
%.out: %.in Makeppfile
&grep &my_filter $(输入) -o $(输出)
如果您在命令中使用 Perl 函数或变量,makepp 不会将其识别为
一种依赖。 告诉 makepp 一切通常更安全,因此使用 Perl 的规则
元素应该依赖于提供这些元素的 makefile 或模块,如
上面的例子。
另一方面,如果您有一个混合程序化的程序,则无知可能是可取的
和配置方面在一个文件中。 一个例子是一个 WSDL 文件,它包含一个
Web 服务接口定义和 IP 地址。 你可以预处理这个文件
&template 命令在配置中打补丁,但不要让 makepp 注意到。
&猫 [选项 ...] 文件名 ...
将所有文件连接成一个。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -i,
--inpipe=shell 命令,-I,--infail,-o,--输出=文件名,-O,--outfail,-S,
--synclines, -v, --verbose"
&chmod [选项 ...] 模式 文件名 ...
套数 模式 对于所有给定的文件。 模式必须是八进制字符串。
"标准选项": "-A, --args-file, --arguments-file=filename, -v, --verbose"
&cp [选项 ...] 源文件 目标文件
&cp [选项 ...] 源文件
&cp [选项 ...] 源文件 ... 目标目录
复制 源文件 至 目标文件一 源文件 到当前目录或多个
源文件s到 目标目录 同名。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -v,
--详细"
-l
- 关联
尝试链接文件。 如果失败,请尝试符号链接,如果这也是
要求,否则复制。
-s
--象征性的
--符号链接
--符号链接
尝试符号链接文件。 如果失败,请复制。
请参阅 &ln 下的注释。
&切 [选项 ...] 文件名 ...
从每个文件或选定的行中打印选定的部分行,计算所有
文件。 输出由分隔符分隔,该分隔符默认为 TAB 字段和
字符的空字符串。
"标准选项": "-A, --args-file, --arguments-file=filename, --force, -i,
--inpipe=shell 命令,-I,--infail,-o,--output=文件名,-O,--outfail,-r,
--record-size=number, --separator=string, -S, --synclines, -v, --verbose"
-c 名单
--字符=名单
打印由指定的所有字符 名单. 列表 可以是任何 Perl 表达式
返回一个整数列表。 整数可以是正数,从
零从头开始计数,或负数从结束开始计数。 不同于Unix
“剪切”,您请求的顺序将得到尊重。
不像在 Perl 的切片运算符中,“..”范围必须是正数或
负数,&cut 允许以正数开始并以负数结束。 但
仅当您的表达式仅包含数字、逗号和
“……”。 例如,“1..-2”表示除第一个 (0) 和最后一个 (-1) 之外的所有内容。
列表表达式可以查看 $_ 中的整行。 对此的更改将是
然而,被忽略,因为当这个表达式被计算时,该行已经
已拆分为 Perl 的自动拆分变量 @::F。 你返回的数字实际上是
该列表的索引。
-d 绳子
--分隔符=绳子
为输入字段和输出设置新的分隔符。 不像 Unix “cut”,这可能有
任何长度。
-E
- 无处可逃
将 "\" 视为 "-p, --printf=format" 的普通文字。
-f 名单
--字段=名单
打印由指定的所有组 名单. 列表 如“-c,
--characters=list”。请注意,这隐藏了标准选项“-f”,它必须是
以“--force”形式给出。
-l 名单
--行=名单
打印由指定的所有行 名单. 列表 如“-c,
--characters=list" 有一个主要区别:第一行编号为 1,
不是第 0 行。这对于大文件来说绝对是低效的,如果你有一个混合
列表中的正到负范围,因为它将所有内容都读取到内存中。
否则 Perl 可以优化它,但我不知道它是否可以。
-m
- 匹配
仅打印匹配的行,即具有足够字符或字段的行。 这个
暗示“--only-delimited”,这就是为什么你会错过单场行
“--fields=0”。
-p 格式
--printf=格式
将格式(使用 \escapes)应用于所有字段或字符。
-s
--仅分隔
仅打印包含分隔符的行。
&cut -c 10-20,-5,25- $(输入)
&cut -c 'grep $$_ % 3, 0..99' $(input) # 第 1 列不是 100 的倍数
&cut -d: --fields 0,4 --printf='%10s 是 %s\n' / etc / passwd文件
&回声 [选项 ...] 绳子 ...
&printf [选项 ...] 格式 论点 ...
&是的 [选项 ...] 绳子 ...
将所有字符串写入标准输出或给定的输出文件。 &echo 和 &yes 都添加换行符
在末尾。 字符串或 &printf 格式可能包含“\”转义符,因为它们
来自 C 或现代 Unix 或 Shell “echo”。 然而它们在 Perl 中是双重的
引号,这意味着一些差异,例如不允许单个尾随“\”。
Perl 有一些更有趣的转义,但你可能希望做些什么
不同的是:
\cA 是控制字符 ^A。
\u 将以下字母大写。
\U 将其余部分大写,或者到下一个“\E”或“\L”(如果找到)。
\xHH, \X{H}
是给定十六进制代码的字符值。 请注意,数字代码不是
可移植到 EBCDIC 平台!
与 Unix 的“yes”不同,&yes 与 &echo 完全一样,除了它重复输出
只要可以,通常直到“--output'| 命令'” 终止。 并且,如果 &yes
没有参数,它默认为“y”。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -o,
--output=filename, -O, --outfail, -v, --verbose"
-E
- 无处可逃
将“\”视为普通文字。
-n
--无新行
不要在最后一个字符串后添加换行符。 (&printf 不理解。)
&expr [选项 ...] 代码 ...
打印 perlcode 的标量值,它可以写成一个或多个参数。
请注意,Shell 不会解析内置命令,因此“*”、“(”或“>”不是
特别的。 但是字符串引号是由makepp解析的,所以Perl字符串必须加引号
两次,除非你想使用裸词。 如果值为 false,则此操作失败。 笔记
那 -- 与 Unix "expr" 不同 -- Perl 的索引函数从 0 (false) 开始并返回
-1 (true) 表示失败。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -o,
--output=filename, -O, --outfail, -v, --verbose"
-n
--无新行
不要在输出后添加换行符。
&expr ($(VAR) - 3) * 2 < 1 && -1 || 1
&expr "$(VAR) - 3 * 2 < 1 ? 'joy' : 'sorrow'" -o $(output)
-&expr $(VAR) - 3 * 2 -o >>$(输出)
&grep [选项 ...] 代码 文件名 ...
&perl [选项 ...] 代码 文件名 ...
&sed [选项 ...] 代码 文件名 ...
所有文件都被逐行读取(除非您提供了“--separator”选项),并且
代码 在打印之前对每一行进行评估。 &sed 类似于
"perl -pe",而 &grep 只输出那些行 代码 返回一个真
价值。 &perl 类似于 "perl -ne",只输出你明确打印的内容
,在 代码. 行内容在 $_ 中可用,可以修改。
在这三个中,只有 &grep 会在不输出任何内容时失败。 请注意,没有
忽略大小写选项,因为你会用“/正则表达式/我”.
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -i,
--inpipe=shell 命令,-I,--infail,-o,--output=文件名,-O,--outfail,-r,
--record-size=number, -s, --separator=string, -S, --synclines, --verbose"
如果您使用 &Mpp::Cmds::print ,则选项“--synclines”仅对 &perl 有意义
输出 $_。 只有 &grep 有额外的选项:
-c
- 数数
抑制正常输出; 而是打印匹配行的计数。 用“-v,
--invert-match" 选项(见下文),计算不匹配的行。
-l
- 列表
--带匹配的文件
仅输出那些匹配的文件的名称。 当这与“-v,
--invert-match", 输出行不匹配的文件名(有点
荒谬但与 Unix -vl 兼容)。 当这与加倍结合时
“-vv”,输出不匹配的文件名。
-v
- 反之亦然
--恢复匹配
--反转匹配
反转匹配感,选择不匹配的行。 请注意,这隐藏了
必须以“--verbose”形式给出的标准选项“-v”。
-w 文件名
--废物文件=文件名
一个可选的垃圾桶,用于收集被拒绝的线路。 这不仅是为了
调试您的选择代码,也用于将您的输入一分为二。 与
正常输出,你可以在返回false之前修改$_。
&sed s/foo/bar/ f1 f2 f3 -o outfile # 类似 sed s/foo/bar/ f1 f2 f3 >outfile
&sed '$$_ = uc' f1 f2 f3 -o outfile # like tr '[:lower:]' '[:upper:]' f1 f2 f3
&grep '$$. % 3' f1 f2 f3 -o outfile # 删除每第三行
&grep -c /match/i f1 f2 f3 # 计算匹配'match'到STDOUT的行数
在不强迫您大量生成访问器的情况下,您可以通过以下方式简单地做到这一点
在每种类型和所需的变量名称之间添加 RO 或 RW 注释,全部放在一个
线。 生成的 getter 和可选的 setter 方法进入下一个找到的
公共或受保护的部分:
# 从“type /* R[OW] */ member;”创建get和set方法。
子 cxx_accessors {
$acc ||=''; # 5.10.0 状态的候选者
if( m!^\s*(.+?)\s*/\*\s*R([OW])\s*\*/\s*(.+?)\s*;!) {
$acc .= "#line $.\n"; # 告诉 C++ 这是从哪里来的
$acc .= "void set\u$3( const $1 &__tmp ) { $3 = __tmp; }"
如果 $2 eq 'W';
$acc .= "const $1 &get\u$3() const { return $3; }\n";
} elsif( /^\s*(?:public|protected)\s*:/ ) {
$_ .= $acc;
$acc = '';
}
}
%.cc: %.cc.in # 使用 &sed 进行 I/O 处理
&sed --sync-lines &cxx_accessors $(input) -o $(output)
&安装 [选项 ...] 源文件 目标文件
&安装 [选项 ...] 源文件 ... 目标目录
&install --目录 [选项 ...] 目录 ...
移动或重命名 源文件 至 目标文件, 或多个 源文件s到 目标目录 与
一样的名字。 这是将构建结果传输到最终结果的首选方式
安装位置。
&install 执行的每个文件系统修改都会记录到
由环境变量 $INSTALL_LOG 指向的文件,或者,如果没有设置但
我们在一个目录下 RootMakepp文件(.mk), 到一个文件 .install_log 在那里面
目录,否则到当前目录中的那个文件。 您可能想要删除
一系列 &install 调用之前的日志文件。
"标准选项": "-A, --args-file, --arguments-file=filename, -v, --verbose"
-c
- 复制
复制文件而不是移动它们。 这是可取的,因为它不强制
makepp 下次重建文件。 但这不是默认值,因为
与其他安装程序的兼容性。
-d
- 目录
在此命令的第三种形式中,创建所有给定的目录和任何
必要的父目录。
-g 组
--组=组
更改目标文件的组所有权。 该组可以由
名称或数字。
-l
- 关联
尝试链接文件。 如果失败,请复制。
--日志=文件名
--日志文件=文件名
使用 VHDL 语言编写 文件名 而不是普通的日志文件。
-m 模式
--模式=模式
套数 模式 对于所有目标文件或目录。 模式必须是八进制字符串。
-o 业主
--所有者=业主
更改目标文件的所有权。 所有者可以通过姓名或
数字上。
-r
- 解决
--resolve-符号
--resolve-symbolic-链接
--resolve-符号链接
-S
--象征性的
--符号链接
--符号链接
创建符号链接而不是移动。 这些选项被传递给 &ln 并且是
在那里描述。
-s
- 跳闸
在目标文件上调用必须位于 $PATH 中的“strip”实用程序。
&ln [选项 ...] 源文件 目标文件
&ln [选项 ...] 源文件
&ln [选项 ...] 源文件 ... 目标目录
链接 源文件 至 目标文件一 源文件 到当前目录或多个
源文件s到 目标目录 同名。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -v,
--详细"
-r
- 解决
--resolve-符号
--resolve-symbolic-链接
--resolve-符号链接
这就是您一直希望“ln -s”做的事情。 创造象征性而不是硬性
链接,不是指向指定的字符串,而是指向给定的文件。
-s
--象征性的
--符号链接
--符号链接
创建符号链接而不是硬链接。
请注意: 在各种文件或操作系统上,不支持此操作。 或者它
是,例如由 Cygwin,但不被本地 Windows 编译器理解,如果你使用一个。
对于无法更改的 makefile,至少要获得某种结果,&ln 和 "&cp -l
-s" 可以为您复制文件(尽管不是目录)。要实现这一点,您
在调用 makepp 之前需要导出以下变量:
出口 MAKEPP_LN_CP=1
&ln --resolve 或 --symbolic 将复制文件而不是创建符号
链接。
出口 MAKEPP_LN_CP=2
&ln 将复制文件而不是创建硬链接。
出口 MAKEPP_LN_CP=3
&ln 的所有调用都将复制文件而不是创建任何一种
链接。
&mk目录 [选项 ...] 目录 ...
创建目录。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -v,
--详细"
-m 模式
--模式=模式
套数 模式 对于所有创建的目录,不管 umask。 模式必须是
八进制字符串。
-p
--父母
还要创建任何必要的父目录。 忽略目录创建失败
由于目录已经存在(即使它是由
另一个过程)。
&mv [选项 ...] 源文件 目标文件
&mv [选项 ...] 源文件
&mv [选项 ...] 源文件 ... 目标目录
移动或重命名 源文件 至 目标文件一 源文件 到当前目录或多个
源文件s到 目标目录 同名。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -v,
--详细"
&预处理 [选项 ...] 变量=定义 ... 文件名 ...
这与 makepp 对 makefile 所做的完全相同的文件预处理。 这是
比 &template 更强大,但在语法上不适合包含大量
"$" - 符号,如 Makefile 或脚本。
条件语句,以及语句“include”/“_include”(此处为
既不构建文件也不向上搜索),“perl”/“makeperl”/“perl_begin”或
处理“sub”/“makesub”或您在文件中定义的任何语句。 空的
和注释行被删除。
但是,它不会学习构建规则,而是会在之后输出所有剩余的行
"$(...)" 表达式扩展。 为了防止声明被识别为这样,
您可以在它们之前添加一个空表达式“$()”。 这同样适用于你
想要留空或应保留领先的评论标志。 同样,如果一个
尾随反斜杠不是将一行与下一行连在一起,在它后面加上“$()”。
普通线按原样输出。
带有 $(MAKEEXPRESSIONS) 的行被扩展并输出。
ifdef WANTTHIS # 无论是否定义都不会得到输出
可能得不到输出
ENDIF
包含一些文件
_include 一些可能不存在的文件 # 或 -include
$()include 空表达式防止关键字被识别。
# 注释行和空行被吞掉。
$()# 除非它们被一个空表达式所掩盖。
$()
空表达式防止 \$()
反斜杠继续被识别。
可能会给:
普通线按原样输出。
带有任何扩展和输出的行。
这里有很多内容......
包含空表达式可防止关键字被识别。
# 除非他们被一个空的表达式所掩盖。
空表达式防止\
反斜杠继续被识别。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -o,
--output=filename, -O, --outfail, -S, --synclines, -v, --verbose"
-a
- 任务
还可以像 makepp 一样处理文件中的分配。 唉,这样的行不能
用空的“$()”屏蔽,因为构造变量名是合法的
表达式。 这另外承认陈述“定义”,
“export”/“unexport”和“override”(这些可以用“$()”屏蔽)。
-H \\%哈希
--hashref=\\%哈希
这允许预先分配变量值,包括不容易的长值
传入一个命令。 传递的表达式可以是任何返回一个的 Perl 代码
哈希参考。 这与传递给命令的任何其他变量合并,
包括来自另一个“--hashref”选项。
&R M [选项 ...] 文件名 ...
如果您有目录写权限,请删除文件。 这就是 Unix "rm -f" 的意思
删除,因为它对交互使用有特殊的保护,不需要在
生成文件。
"标准选项": "-A, --args-file, --arguments-file=filename, -v, --verbose"
-f
- 力量
这可以防止抱怨不存在的文件。 这是副作用
选项在 Unix 中有,并且是唯一在这里有意义的选项。
-m
--元信息
除了给定的文件,这也会删除元信息 makepp
将它们存储在 .makepp 目录中。 因此 makepp 忘记了它所知道的一切
关于给定的文件。 如果 .makepp 目录在此之后变为空,它也会
被删除。
这也将删除给定的目录,但前提是它们为空。 为方便
这样,它将按照深度降序最后删除目录。 这样你就可以
使用“**”表达式删除整个层次结构。 这是一个可以在以下位置找到的示例
许多顶级制作文件。 请注意,有一个“makeppclean”实用程序可以执行
这更有效。
$(虚假清洁旧):
&rm -fm $(only-stale **/*)
$(虚假清洁):cleanold
&rm -f $(通配符**/*.[ao])
$(phony distclean): 干净
&rm -fm $(only-targets **/*)
&种类 [选项 ...] 文件名 ...
按字典顺序将所有文件排序在一起。 这对于相当大的来说是低效的
文件,因为它完全发生在内存中。 如果组合大小为
所有文件都超出了您有权使用的内存。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -i,
--inpipe=shell 命令,-I,--infail,-o,--output=文件名,-O,--outfail,
--record-size=number, -s, --separator=string, -v, --verbose"
-c 代码
--比较=代码
代码 表示一个 Perl 排序块,两个排序候选在 $a 和
$b。
-n
- 数字
--数字排序
这种排序对记录的开头进行数字排序。 领先的空白是
跳过。 如果数字不在,您可以使用“--transform”和“--detransform”
开始。
-r
- 逆转
以相反的顺序输出结果。 请注意,这隐藏了标准选项
“-r”必须作为“--record-size”给出。
-t 代码
--转换=代码
-d 代码
--反变换=代码
如果你有一个复杂的代码,排序变得越来越昂贵
记录数 n,因为代码被称为 O(n 日志(n)) 次。 避免
那,你可以让 Perl 专注于排序,首先修改
字符串,这样每条记录都会提取一次复杂的搜索条件,
并在对它们进行排序后将它们修改回来。
如果给出这些选项,则“--transform” 代码 被映射到记录
在$_中一个一个,并且可以修改它们。 排序后,“--detransform”
代码 一个接一个地映射到 $_ 中修改的记录,并且可以
修改回来。 您通常不会使用这些选项或两者都使用,除非
你想输出修改后的行。
将字符串转换为提取排序条件的结构,您的
“ - 相比” 代码 可以拾取被称为施瓦兹变换 (ST)。
将所有内容打包到字符串本身中,以便没有“--compare” 代码 is
需要,允许在不执行昂贵的 Perl 的情况下进行整个排序
代码,称为 Guttmann-Rosler 变换 (GRT)。 您可以通过以下方式找到提示
在网上搜索这些名字。
# 按值对数值表达式进行昂贵的排序($$ 保护 $ 免受 makepp 扩展)
&sort --compare 'eval( $$a ) <=> eval( $$b )' $(input) -o >>$(output)
# ST 不区分大小写排序
&sort -t '[lc, $$_]' -c '$$a->[0] cmp $$b->[0]' -d '$$_->[1]' $(input) - o >>$(输出)
# GRT 使用 Makeppfile 中其他地方定义的修改函数
&sort -t &transform -d &detransform $(输入) -o >>$(输出)
-u
--uniq
- 独特的
排序后,消除重复项。 这些要么是相同的行,要么
给出了“--compare”选项,那些 代码 报告为等效。
&模板 [选项 ...] 宏=定义 ... 文件名 ...
这是一个宏预处理器,不如 C 预处理器或“m4”强大。
请参阅 &preprocess 以获得更强大的替代方案。 它的灵感来自 automake 的宏
替换在 生成文件 和 生成文件. 但它不止于此。 任何普通文本
通过不变。 默认情况下,特殊结构以“@”分隔。 他们
必须适合一行,除非您通过“-r、--record-size”或“--separator”之一。
@# 评论 @
请注意,尽管借用了脚本“#”行结束注释语法,但这个语法是
内联注释。
@MACRO@
这个构造被替换为 MACRO. 宏名称必须以
一个字母或下划线,后跟任意数量的字母、下划线、减号或
点。 与 makepp 名称不同,下划线和减号是不等价的。
@MACRO(参数 1,参数 2...)@
像第一个,但参数化。 args 替换 $1 到 $9 或
“${数字}” 在价值。 或者,如果值是 Perl 函数,则它们作为
正常参数。 结果然后替换整个构造。 一级
宏嵌套是可能的,因为括号中的参数可能包含普通
"@MACRO@" 调用,如在 "@f(@x@)@" 中,其中 "@x@" 在被扩展之前被扩展
替换为“f”的主体。
@包括(文件名)@
这是唯一的预定义宏。 它被替换为 &template-processed
命名文件的内容。 像所有宏一样,这可能发生在
线。 唉,因此,“-S,--synclines”忽略文件包含,使
一切似乎都来自包含文件。
@MACRO=定义@
@MACRO?=定义@
这在文件中定义了一个宏。 这被什么都取代了。 第二
form 仅在未定义宏的情况下才生效,大概是在命令上
线。
@MACRO { 代码 }@
这也定义了一个宏,它的主体是一个 Perl 子。 论据,如果
有任何,作为@_ 传递。
@{ 代码 }@
这运行 代码 立即并被返回值替换。
到目前为止,我们只看到了一种用于嵌入特殊事物的语法。 还有另一种
多行语法,两者都允许变体来抑制换行符。 这些是
内置语法(可以通过下面的选项进行配置)。 这里 特别 代表
上面显示的任何结构:
@特别@
@特别@\
这可以出现在一条线上的任何地方。 紧随其后的变体
"\" 只在行尾有效。 它还替换了以下换行符。
@@特别@@ 正常 文本 @@
@@特别@@ 正常 文本 @@\
这和上一个一样。 然而,也被替换的普通文本,
可以跨越多行。 您可以将特殊部分放在注释行周围
仅在卸载的脚本中需要的源代码,被删除或
安装过程中更换:
#@@#接下来的两行会消失@@
echo 您正在运行此脚本的卸载版本
#@@
#@@REPLAMCENT@@
回声会有别的东西在这里
#@@
一个显示各种可能性的无意义示例:
@m1=一些定义@\
@m2=foo $1 酒吧@\
@middle_of_arg=iddl@\
@m1@@m2(m@middle_of_arg@e)@
@@m2(多行)@@
...
@@ 纯文本 1 + 2 = @{ 1 + 2 }@
成为
一些定义 foo 中间栏
foo 多行 bar 纯文本 1 + 2 = 3
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -i,
--inpipe=shell 命令,-I,--infail,-o,--output=文件名,-O,--outfail,-r,
--record-size=number, --separator=string, -S, --synclines, -v, --verbose"
-d
--定义
仅替换实际定义的宏实例。 没有这个选项
未定义的将全部替换为空。
-H \\%哈希
--hashref=\\%哈希
这允许预先分配宏值,包括不容易的长值
传入一个命令。 传递的表达式可以是任何返回一个的 Perl 代码
哈希参考。 这与传递给命令的任何其他宏合并,
包括来自另一个“--hashref”选项。 哈希值也可以是代码
引用,在这种情况下,函数被调用,就像“@macro { 代码 }@"
定义。
-s /前缀/后缀/
--简单=/前缀/后缀/
使用 VHDL 语言编写 字首 和 后缀 之前和之后 特别 分别代替“@”。 这
第一个字符是分隔符,不需要是斜杠。 这些值是 Perl
正则表达式。 你不能引入像“(...)”这样的分组,但是“(?:...)”是可以的。
-m /前缀/后缀/后缀/[后缀/]
--多行=/前缀/后缀/后缀/[后缀/]
使用 VHDL 语言编写 字首, 后缀 和 后缀 之前和之后 特别 并在
分别阻止而不是“@@”。 如果 后缀 还给出了宏名称
必须在它之前重复。 第一个字符是分隔符,不需要
斜线。 例如,一个 XML-ish,如果你想,你必须添加“--defined”
保留其他标签,不是你定义的:
--defined --simple=|<|/>| --multiline=|<|>| |
或者,更好的是,使用处理指令“ ",用于这样的目的:
--defined --simple='|<\?|\?>|'
或者,如果您想将其与“&entity;”结合使用简单宏的语法
替换(保留不是注释的数字实体“☺”):
--defined --simple='_(?:&(?!#)|<\?)_(?:;|\?>)_'
&触碰 [选项 ...] 文件名 ...
将每个文件的修改和访问时间戳更新到现在。 如果文件
不存在,它被创建。
"标准选项": "-A, --args-file, --arguments-file=filename, -v, --verbose"
&卸载 [选项 ...] [文件名 ...]
卸载以前由 &install 安装的文件。 这 文件名s 是写入的日志文件
通过&安装。 如果没有给出,也没有给出“--inpipe”选项,则读取默认日志文件
的&安装。
"标准选项": "-A, --args-file, --arguments-file=filename, -i,
--inpipe=shellcommand, -I, --infail, -v, --verbose"
&uniq [选项 ...] 文件名 ...
丢弃所有连续的相等线,但一条除外。
"标准选项": "-A, --args-file, --arguments-file=filename, -f, --force, -i,
--inpipe=shell 命令,-I,--infail,-o,--output=文件名,-O,--outfail,-r,
--record-size=number, -s, --separator=string, -S, --synclines, -v, --verbose"
-c 代码
--比较=代码
本篇 代码 获取 $a 和 $b 中的前一行和当前行并返回
如果认为两条线相等,则为真。
&uniq --compare='lc( $$a ) eq lc $$b' $(inputs) -o $(output)
可模拟 命令
各种东西不是内置的,但可以用其他命令来实现:
awk 使用 &sed。
chgrp
乔恩
这些命令大多不可移植! 他们要么悄悄地什么都不做,要么失败,
取决于系统。 一般只有root才能进行这些操作,也就是
为什么它们只能通过 &install 命令使用。
cpp 使用 &preprocess 或 &template。
日期
其中任何一个都部分地做同样的事情:
&expr 本地时间
&expr gmtime
false
使用不带参数或 0 的 &expr。
头
尾巴
您可以使用 &grep 或 "&cut --lines" 获得相同的结果:
&grep 1..10 文件 # 前十行
&grep 10..eof file # 从第十行开始的所有行
&cut --lines -10..-1 file # 最后十行
注意 &grep 中的 1..10 是 Perl 的行号触发器操作符,这很烦人
从 1 开始。不要从 0 开始,否则触发器永远不会变为真。
fmt 这里提到这是因为 Perl 提供了一个相关的功能。 然而我有
在 makefile 中使用“格式”声明的问题。 什么工作是
底层的“formline”功能。 例如,转换由名称和名称组成的 csv 文件
价格为表格格式:
子 csv2txt {
formline "\@<<<<<<<<<<<<<< ^###########.##\n", 拆分 ',';
$_ = $^A;
$^A = '';
}
%.txt: %.csv
&sed &csv2txt $(输入) -o $(输出)
m4 使用 &preprocess 或 &template。
命令rmdir
使用 &rm。
tr 使用 &sed。
使用 onworks.net 服务在线使用 makepp_builtins