同じ行に '{' と '}' がある行を除くすべてのファイルで、perl プログラムに '{' - > '{function('.counter++.')' の置換を実行させたいのですが、 '{' が 'typedef' 部分文字列の 1 行下にある場合を除きます。
#!/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
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"
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('.counter++.');' に置き換えます。
残念ながら、このコードは機能しません。私はそれを一日中機能させようとしているのに、まだうまくいかないと言うのは恥ずかしい.どうして。助けていただければ幸いです。
また、私はWindows環境で作業していることを付け加えたいと思います。
ありがとうございました!!
編集:これまでのところ、あなたの助けを借りて、これはコードです:
use strict;
use warnings;
use File::Find;
my $dir = "C:/projects/SW/fw/phy"; # use forward slashes in paths
# 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
while (<>) {
s/{/'{ function(' . $counter++ . ')'/ge unless /}/;
print;
}
残っている唯一のことは、次のように「typedef」サブストリングの下の 1 行である場合に「{」置換を無視するようにすることです。
typedef struct
{
}examp;
私はあなたの助けに感謝します! ありがとうございました!:)
編集#2:これは最終的なコードです:
use strict;
use warnings;
use File::Find;
my $dir = "C:/exmp";
# 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;
my $td = 0;
# now process our files
while (<>) {
s/{/'{ function(' . $counter++ . ')'/ge if /{[^}]*$/ && $td == 0;
$td = do { (/typedef/ ? 1 : 0 ) || ( (/=/ ? 1 : 0 ) && (/if/ ? 0 : 1 ) && (/while/ ? 0 : 1 ) && (/for/ ? 0 : 1 ) && (/switch/ ? 0 : 1 ) )};
print;
}
置換場所の上の行に 'typedef' が含まれている場合を除いて、コードは置換を行います。その上の行に '=' が含まれていて、'if'、'while'、'for'、または 'switch' が含まれていない場合、置換も行われません。 .
ご協力ありがとうございました!