我有一个文件t_code.txt
,其中我想用包含PIOMUX_UART1_TXD
和{{PIOMUX_UART1_RXD
的字符串替换所有出现的字符串@array1
和TXD
1}}分别然后将其打印在新文件RXD
中,但它不起作用
c_code2.txt
答案 0 :(得分:2)
代码中的几个问题:
为了能够在替换的替换部分中使用代码,您必须使用/e
修饰符。
在s///
构造中,您无法使用/
无引号。更改分隔符,或反斜杠。
替换中的替换部分是一个字符串。在代码的情况下,它在标量上下文中进行评估。标量上下文中的grep
返回匹配数。
比照:
#! /usr/bin/perl
use warnings;
use strict;
my @array1 = qw( aTXDb cRXDd );
while (<DATA>) {
s/PIOMUX_UART1_TXD/join q(), grep m=TXD=, @array1/eg;
s/PIOMUX_UART1_RXD/join q(), grep m=RXD=, @array1/eg;
print;
}
__DATA__
PIOMUX_UART1_TXD
PIOMUX_UART1_RXD
答案 1 :(得分:2)
由于@array1
(顺便提一下标识符的可怕选择)在循环内部没有变化,因此最好在外部构建替换字符串,而不是每次进行替换。
目前尚不清楚要将PIOMUX_UART1_TXD
和PIOMUX_UART1_RXD
替换为哪个字符串,但此代码使用逗号连接数组的所有匹配元素并使用它。如果你需要,我希望如何做一些不同的事情。
我还使用了while
循环,因为不需要事先将整个文件读入数组。
my ($in_file, $out_file) = qw/ t_code.txt c_code2.txt /;
open my $in_fh, '<', $in_file or die qq{Unable to open "$in_file" for reading: $!};
open my $out_fh, '>', $out_file or die qq{Unable to open "$out_file" for writing: $!};
my ($txd) = grep /TXD/, @array1;
my ($rxd) = grep /RXD/, @array1;
while ( <$in_fh> ) {
s/PIOMUX_UART1_TXD/$txd/g;
s/PIOMUX_UART1_RXD/$rxd/g;
print $out_fh $_;
}
close $out_fh or die $!;