linux - 如何在 perl 中为 makefile 进行循环

标签 linux perl makefile

我正在尝试使用 makefileperl oneliner 自动创建 php 类。

我有这个文件document.txt

[ENTITY]
Document
MyDefaultBundle
number:string(200)
issueDate:datetime
expiryDate:datetime
file_path:string(200)
filename:string(200)
description:text
document_type:string(200)

基本上第一行是classname,第二行是Bundlename,第三行是fields

我在 make 文件中使用它来执行 symfony 命令来生成类

MYFILE = Entity/document.txt
READ_ENTITY=eval `perl -l -00pe 'y/\n\r[]/ /d; s/([A-Z]+) (\w+) (\w+) (.*)/$$1=$$3:$$2\nFIELDS="$$4"\n/g' $1`
mytest:
        $(call READ_ENTITY,$(MYFILE)) && $(SYMFONY_COMMAND) --entity=$$ENTITY --fields="$$FIELDS" 

这对于一个实体来说效果很好。 (我已经用 $$ 转义了 $)

现在我的条件是我有多个实体在循环中

文档.txt

[ENTITY]
Document
MyDefaultBundle
number:string(200)
issueDate:datetime
expiryDate:datetime
file_path:string(200)
filename:string(200)
description:text
document_type:string(200)

[ENTITY]
Document2
MyDefaultBundle
number:string(200)
issueDate:datetime
expiryDate:datetime
file_path:string(200)
filename:string(200)
description:text
document_type:string(200)

[ENTITY]
Document3
MyDefaultBundle
number:string(200)
issueDate:datetime
expiryDate:datetime
file_path:string(200)
filename:string(200)
description:text
document_type:string(200)

所以我想在循环中执行该语句。我不知道如何在 make 文件中执行此操作。

基本上使用eval,我制作shell变量ENTITYFIELDS,然后在symfony命令行中使用它

有什么想法吗?

编辑:

对于perl命令,上面显示的document.txt,即输入

perl coomand 的输出是

ENTITY=MyDefaultBundle:Document
FIELDS="number:string(200) issueDate:datetime expiryDate:datetime file_path:string(200) filename:string(200) description:text document_type:string(200)"

这基本上使它们成为 shell 变量,以便我可以使用 $ENTITY 插入它们

问题是,当我有多个由空格分隔的 [ENTITY] 时,我无法将其用作最后一个条目并覆盖实体变量。

我想要一些类似的东西

for [ENTITY] IN document.txt
   EXECUTE $(call READ_ENTITY,$(MYFILE)) && $(SYMFONY_COMMAND) --entity=$$ENTITY --fields="$$FIELDS"

这样在每个循环中我都有不同的ENTITYFIELDS变量

最佳答案

如果您使用 makefile 模式规则,则此处可能不需要循环。

  1. 为每个输出 php 文档创建一个输入文件。
  2. 创建一个模式规则,该规则采用一个输入文件并生成一个 php 文档。确保该命令生成的文件是目标名称:

    # Take input files from Entity/, produce outputs in Documents/
    Documents/Document%.php : Entity/document%.txt
        EXECUTE $(call READ_ENTITY,$<) && $(SYMFONY_COMMAND) --entity=$$ENTITY --fields="$$FIELDS" --output-filename=$@
    
  3. 创建取决于需要构建的文档的规则:

    all : Documents/Document1.php Documents/Document2.php Documents/Document3.php
    .PHONY: all
    
  4. 调用make all。如果目标 all 是 makefile 中的第一个目标(这是一种约定),那么只需 make

关于linux - 如何在 perl 中为 makefile 进行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21797591/

相关文章:

android - Fedora 64 位中的 Android 模拟器使用哪个 libGL?

c++ - 在 f2c.h 文件中定义 min() max() 宏时出错

perl - 如何测试需要用户凭据的 CPAN 包

合并多个文本文件的perl代码

Makefile:所有与默认目标

c++ - make/gmake 的条件依赖

linux - 将多个文件合并为一个文件,文件名位于数据之前

linux - SMP 的缓存一致性是通过硬件还是软件来保证的?

mysql - 无法在 Perl 中使用 DBI 在 mysql 中插入变音符号文本的等效纯文本

c++ - GNU 使 : generate list of source files