perl 文件间的匹配替换
发布网友
发布时间:2022-05-06 08:56
我来回答
共4个回答
热心网友
时间:2022-06-29 04:58
my $inputF = @ARGV[0];
my $inputS = @ARGV[1];
my $output = @ARGV[2];
open INPUTF , $inputF or die "cannot open the file:$inputS$!\n";
open INPUTS, $inputS or die "cannot open the file:$inputS$!\n";
open OUTPUT, ">$output" or die "cannot open the file:$inputS$!\n";
our @listN=();
our %listL=();
my @line;
while(<INPUTF>)
{
chomp;
next unless $_;
@listN = split /;/,$_; #将text1.txt 用“;”分割,放入数组@listN中
foreach my $n(@listN) #每行的内容都放入另一个数组@line里面保存
{ #(直至最后全部存在@line中)
push (@line, $n);
}
}
#print "@line\n"; #调试
while(<INPUTS>)
{
chomp;
next unless $_;
my @map = split /\s+/,$_; #将text2.txt 用空格分割放入数组@map中
$listL{$map[0]}=$map[1] unless exists $listL{$map[0]};#并将$map[0]作为key值存在哈希
}
foreach my $list(@line) #把text1.txt中的全部拿出来找相关的mapping对象
{
if (exists $listL{$list}) #如果找到了 证明有mapping object
{
print OUTPUT "number: $list, mapping: $listL{$list}\n"; #输出到text3.txt中(自命名)
}
}
#perl F:\perltest\mapping.pl F:\perltest\text1.txt F:\perltest\text2.txt F:\perltest\text3.txt追问谢谢你写的这么详细,请问
my @map=split/\s+/,$_; #将text2.txt用空格分隔放入数组——>变成用“tab”分隔怎么写?
追答my @map=split/\t/,$_; # \t 表示 tab
热心网友
时间:2022-06-29 04:58
你想要的是一个 FULL JOIN,而不是简单的“查找替换”
FULL JOIN 用笛卡尔积来求。
建立两个 LIST 分别对应两个表,
foreach $a in (@a) {
foreach $b in (@b) {
# ... <A>
}
}
在 <A> 处,判断 $i 和 $j 的键是否相同,如果相同,则进行 JOIN 操作:
$ak = $a->[0];
$bk = $b->[0];
if ($ak eq $bk) {
# JOIN:
my @av = (@a);
my @bv = (@b);
shift @bv;
my @c = (@av, @bv);
print join(', ', @c) . "\n";
}
热心网友
时间:2022-06-29 04:59
s/需替换字符/替换字符/g
g表示全局替换
热心网友
时间:2022-06-29 04:59
$txt1=<<TXT;
1432;3551;51135;5518;5519;5520;5522;55844;5970
1432;3551;51701;5608;9020;9064
1432;3551;5595;5601;5602;5608
1432;3551;5595;5601;5602;5970;8767
1432;3551;5608;7186;9020;9064
1432;3659;5610;5970;9451
1432;3659;5610;673;9451
1432;3725;5595;5601;5602
TXT
$txt2=<<TX;
1432 adec
2778 lkhj
2799 snjkl
2811 sdf
2821 pop
2885 myc
2977 myb
3033 cde
TX
%mima = map {split/\s+/,$_} split/\n/,$txt2;
@txt1 = split/\n/,$txt1;
open DDD,">d:/text3.txt";
$i = 0;
while($i<=$#txt1){
@txt =split/\;/,$txt1[$i];
@va = map{$mima{$_}?$mima{$_}:$_} @txt;
$va=join ';',@va;
print"$va\n";
print DDD "$va\n";
$i++;
}
close DDD;