下面我将仅提供一个我想写的大量perl脚本。我在else语句中遇到语法错误但在控制台窗口中它只在perl脚本中说出语法错误而没有清楚地告诉错误。我正在尝试创建一个变量文件file_no_$i.txt
并在其中复制t_code.txt
的内容,然后使用一些选定的哈希值%defines_2
open ( my $pointer, "<", "t_code.txt" ) or die $!;
my $out_pointer;
for (my $i=0 ; $i <=$#match ; $i++) {
for (my $j=0; $j <= $#match ; $j++) {
if ($match[$i]=~$match[$j]) {
next;
}
else {
my $file_name = "file_no_$i.txt";
open $out_pointer, ">" , $file_name or die "Can't open the output file!";
copy("$file_name","t_code.txt") or die "Copy failed: $!";
my @lin = <$out_pointer>;
foreach $_(@lin) {
$_ =~ s/UART90_BASE_ADDRESS/$defines_2{ $_ = grep{/$match[$i]/} (keys %defines_2)};
}
}
}
}
答案 0 :(得分:2)
您无法在/
构造中使用s///
未加引号。您可以使用不同的分隔符代替反斜杠:
s#UART90_BASE_ADDRESS#$defines_2{ $_ = grep{/$match[$i]/} (keys %defines_2)}#;
它修复了语法错误,但我担心它仍然无法执行您想要的操作。但是,如果没有数据,很难测试。
答案 1 :(得分:1)
我认为你正在做的是编辑一些名称看起来像file_no_1.txt
等的文本文件。你是通过将当前文件复制到t_code.txt
然后读取该文件行来实现的。按行,根据需要进行编辑,将行写回原始文本文件。
该方法的问题在于文件将被复制和重写多次,最好将整个文件读入数组,进行所有编辑,然后在一次操作中将其写回。除非文件很大 - 比如几GB,否则这样会很好。
这是实现该方法的一些代码。您看到$file_name
已定义且@lines
已填充在内部循环中。最里面的循环修改@lines
的元素,再次在该循环之外,@lines
被写回原始文本文件。
我无法理解你的代码的一些事情。
我不确定您是否应该使用=~
,或者您打算使用简单的eq
。前者执行了包含测试,过去你遇到了一个问题,你要检查第一个字符串是否在第二个结尾
grep
电话
grep{/$match[$i]/} (keys %defines_2)
让我担心,因为它可能会返回%defines_2
哈希的多个键,在这种情况下,您自己的代码将插入几乎是哈希元素的随机选择
如果您的代码正常工作那么这很好,但如果没有,那么我希望这可以帮助您解决问题。如果您需要更多关于此代码块的帮助,那么您应该包含一小部分数据样本,以便我们更好地了解正在发生的事情。
for my $i (0 .. $#match) {
my $file_name = "file_no_$i.txt";
my @lines = do {
open my $in_fh, '<', 't_code.txt' or die $!;
<$in_fh>;
};
for my $j (0 .. $#match) {
next if $match[$i] =~ $match[$j];
for ( @lines ) {
my ($match) = grep { /$match[$i]/ } keys %defines_2;
s/UART90_BASE_ADDRESS/$defines_2{$match}/;
}
}
open my $out_fh, '>', $file_name or die qq{Can't open "$file_name" for output: $!};
print $out_fh $_ for @lines;
close $out_fh or die qq{Failed to close output file "$file_name": $!};
}