编辑:我不只是试图征求人们为我编写此代码.....我已经尝试了大约一天,尽管有一本perl教科书,我仍然可以& #39;弄清楚。就像我说的那样,我可以使用grep / awk / sed,也可以通过将多个perl单行连接在一起....我只是无法弄清楚如何在一个perl调用中执行它。
我是Perl的新手,所以这个很容易回答。
我正在尝试编写一个脚本,该脚本将逐行解析文件并在引号之间的行上打印第一个单词,但在包含引号的行上打印 EOL中的特定字符串(字符串作为参数传递)。 C头文件中的文件以及其中的许多其他垃圾包含下面格式的结构定义,其中包含我想要提取的字符串。
struct Foo_t foo
{
/* str_HELLO */
{ {5,4,8,7,9},
{ "HELLO!", // English
"BONJOUR!", // French
"Hallo!", // German
"BONJOURNO!", // Italian
"HOLA!" // Spanish
} },
/* str_GOODBYE */
{ {15,3,3,3,3},
{ "GOODBYE!", // English
"AU REVOUIR!", // French
"TSCHUSS!", // German
"CIAO!", // Italian
"ADIOS!" // Spanish
} },
/* str_FOO */
{ {15,3,3,3,3},
{ "FOO", // English
"BAR", // French
"NOO", // German
"BAZ", // Italian
"OOF" // Spanish
} },
// lots more of these....
// ....
为了获得所需的输出,我希望调用
bash~$: myscript.pl -language=english file_to_be_parsed.h
我可以通过将greps连接在一起来轻松完成此操作,但我真的想在perl中使用它。我试图通过一个脚本和一个单行程来完成这个简单的任务,但没有一个有效。由于这是如此之快,如果任何perl向导可以向我展示光线,以及匹配内容的解释,我将非常感激。
提前致谢!!
答案 0 :(得分:1)
v5.22的实验性功能是code evaluation expressions
。如果成功,您可以从正则表达式中执行代码。结合积极的前瞻,你得到了这个:
/"(.*?)".*(?=english)(?{print "$1\n";})$/i;
答案 1 :(得分:0)
我从
开始perl -wnle '/english/i and ($_ =~ /\"(\w)*\"/ and print $&);' file.h | perl -wlne 's/[",]//g and print;'
到
perl -wnle '/english/i and ($_ =~ /\"(\w*)\"/ and print $1);` file.h
答案 2 :(得分:0)
这样的事情是对您自己的解决方案的改进。它应该被称为
perl filter_header.pl english header.h
use strict;
use warnings;
open my $fh, '<', $file or die qq{Unable to open "$file" for input: $!};
while ( <$fh> ) {
next unless m| // \s* \Q$lang |ix;
print $1, "\n" if / " ([^"]*) " /x;
}
HELLO!
GOODBYE!
FOO