** 我有一个标有“ * *”的后续问题**
我被要求编写 Perl 代码,用每次{
替换{function(<counter>)
,每次替换时,计数器应该变大 1。例如,第一次替换{
will be {function(0)
,第二次替换{
will be{function(1)
等。假设在文件夹中的每个*.c
和*.h
文件中进行替换包括子文件夹。
我写了这段代码:
#!/usr/bin/perl
use Tie::File;
use File::Find;
$counter = 0;
$flag = 1;
@directories_to_search = 'd:\testing perl';
@newString = '{ function('.$counter.')';
$refChar = "{";
finddepth(\&fileMode, @directories_to_search);
sub fileMode
{
my @files = <*[ch]>; # get all files ending in .c or .h
foreach $file (@files) # go through all the .c and .h flies in the directory
{
if (-f $file) # check if it is a file or dir
{
my @lines;
# copy each line from the text file to the string @lines and add a function call after every '{' '
tie @lines, 'Tie::File', $file or die "Can't read file: $!\n";
foreach ( @lines )
{
if (s/{/@newString/g)
{
$counter++;
@newString = '{function('.$counter.')';
}
untie @lines; # free @lines
}
}
}
}
代码搜索目录d:\testing Perl
并进行替换,但
{function(<number>)
我没有得到 {function(number1) function(number3) function(number5) function(number7)
例如我得到的第一个替换
{function(0) function(2) function(4) function(6)
,我想得到{function(0)
我真的不知道我的代码有什么问题。
awk 解决方案或任何其他 Perl 解决方案也会很棒!
* 我有一个后续问题。现在我希望我的 perl 程序在所有文件中执行相同的替换,除了同一行中有“{”
和“}”的行。所以我以这种方式修改了代码。
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
use File::Find;
my $dir = "C:/test dir";
# fill up our argument list with file names:
find(sub { if (-f && /\.[hc]$/) { push @ARGV, $File::Find::name } }, $dir);
$^I = ".bak"; # supply backup string to enable in-place edit
my $counter = 0;
# now process our files
#foreach $filename (@ARGV)
while (<>)
{
my @lines;
# copy each line from the text file to the string @lines and add a function call after every '{' '
tie @lines, 'Tie::File', $ARGV or die "Can't read file: $!\n";
#$_='{function(' . $counter++ . ')';
foreach (@lines)
{
if (!( index (@lines,'}')!= -1 )) # if there is a '}' in the same line don't add the macro
{
s/{/'{function(' . $counter++ . ')'/ge;
print;
}
}
untie @lines; # free @lines
}
我试图做的是遍历我在我的目录和子目录中找到的@ARGV 中的所有文件,对于每个 *.c 或 *.h 文件,我想逐行检查并检查此行是否包含'{ '。如果是,程序将不会检查是否有'{'并且不会进行替换,如果没有,程序将用'{function();'替换'{'
不幸的是,这段代码不起作用。我很惭愧地说,我试图让它工作一整天,但仍然没有成功。我真的很感激一些帮助。
谢谢你!!