如何在当前循环中运行时检查下一行? 另外,如何将C注释移动到表的行尾?
我有一个这样的文件:
array_table=
{
/* comment 1*/ (unsigned int a);
/* comment 2*/ (unsigned int b);
/* comment 3*/ (unsigned int c);
/* comment 4*/ (unsigned int d);
}
我的目的是将这些评论移到行尾,如:
array_table=
{
(unsigned int a); /* comment 1*/
(unsigned int b); /* comment 2*/
(unsigned int c); /* comment 3*/
(unsigned int d); /* comment 4*/
}
我怎样才能在Perl中做到这一点?任何人都可以帮我解决Perl代码吗?
答案 0 :(得分:1)
这样的事情应该有效:
while (<>) {
chomp;
if ($_ =~ m%^(.*)/\*(.*)\*/(.*)$%) {
printf "%s%s/*%s*/%s", $1, $3, $2, $/;
} else {
print $_ . $/;
}
}
括号中的表达式匹配评论之前的任何内容,评论本身以及评论后留下的任何内容。 printf
然后按正确的顺序重新组合它们。
答案 1 :(得分:1)
好的 - 重申我认为你要求的内容,你想解析一个文件,并寻找表格的分配
foo=
{
....
}
并且在块中,您希望将注释移动到行尾。有很多方法可以做到这一点,最优雅的方法通常与你在循环中做的其他事情有关。浮现在脑海中的那个只是为了记住最后一行包含'='并在一行开头匹配'{'时使用该事实的事实。使用我最喜欢的perl结构之一,标量上下文中的范围运算符。所以这会给......
my $last_line_an_assignment = 0;
while (<DATA>)
{
if (($last_line_an_assignment && m!^\s*{!) .. m!^\s*}!)
{
s!(/\*.*?\*/)\s*(.*)$!$2 $1!;
}
print $_;
$last_line_an_assignment = m!=!;
}
__DATA__
/* comment other */ (unsigned int a);
other_assignment=
/* not a table */ 12;
array_table=
{
/* comment 1*/ (unsigned int a);
/* comment 2*/ (unsigned int b);
/* comment 3*/ (unsigned int c);
/* comment 4*/ (unsigned int d);
}
/* comment other */ (unsigned int a);
您可以将数据打印到另一个文件,也可以使用perl的'-i'选项更新文件
local (@ARGV) = ($filename);
local ($^I) = '.bak';
while (<>)
{
# make changes to line AND call print
}
这会导致perl备份$ filename(扩展名为'.bak'),然后循环中的所有打印调用都将覆盖文件中的内容 - 有关更多信息,请参阅中的'-i'选项。 “perlrun”手册页。
答案 2 :(得分:0)
如果您只想更改array_table
声明中的评论:
perl -pe's,^(\s*)(/\*.*?\*/)\s*(.*?)[ \t]*$,$1$3 $2, if/^\s*array_table\s*=/../^\s*\}/'
另外简单地说:
perl -pe's,^(\s*)(/\*.*?\*/)\s*(.*?)[ \t]*$,$1$3 $2,'
答案 3 :(得分:0)
使用Regexp :: Common而不是滚动自己的。 E.g。
use Regexp::Common;
while ($_ = <DATA>) {
chomp;
if (s/(^\s*)($RE{comment}{C})//) {
print $1, $_, $2, "\n";
}
else {
print $_, "\n";
}
}
__DATA__
/* comment other */ (unsigned int a);
other_assignment=
/* not a table */ 12;
array_table=
{
/* comment 1*/ (unsigned int a);
/* comment 2*/ (unsigned int b);
/* comment 3*/ (unsigned int c);
/* comment 4*/ (unsigned int d);
}
/* comment other */ (unsigned int a);