我没有从以下代码得到结果:
#!/bash/perl
use strict;
use warnings;
my @file;
my $file2;
open (IN, "+</home/opmeitle/labs-perl/numbers");
@file = <IN>;
seek IN,0,0;
my %change = ( 80.928 => "85.950", 320.000 => "380.500");
my $changekey = join "|", keys %change;
foreach $file2 (@file){
$file2 =~ s/($changekey)/$change{$1}/g;
print IN $file2;}
close IN;
这是/home/opmeitle/labs-perl/numbers
:
80.928
320.000
这是输出:
85.950
380.500.000
这是我想要的结果:
85.950
380.500
感谢您的回答。
路易斯。
但是,看一下这个例子,在代码我的%更改=(nombre =&gt;“name”,mi =&gt;“我的”Hola,mi nombre es Luis y vivo en Argentina“中更改文件号80.928和320.000 “);这是结果“Hola,我的名字es Luis y vivo en Argentina a”到底,一句话就更多了!因为?
答案 0 :(得分:2)
你的第一个问题出在.
(点)
.
(点) - 在正则表达式中表示“任何符号”。
你在320.000中的第二个问题 - 这是数字,它正好等于320
320.000 = ~s / 320 / 380.500 / g; =&GT; 380.500.000
我认为解决方案可能是将数字类型的哈希键从数字更改为字符串
并逃脱所有点'.' => '\.'
为了支持我的观点,我写了一个小脚本:
#!/usr/bin/perl
my %change = ( 80.928 => "85.950", 320.000 => "380.500");
my $changekey = join "|", keys %change;
print $changekey;
瞧,它会产生输出:320|80.928
但是,当%change hash写为my %change = ( "80.928" => "85.950", "320.000" => "380.500");
时,输出将为320.000|80.928
第三个问题,你在读写模式下打开文件,但是当结果文件的大小较小,然后源,最后会是垃圾。为避免这种情况,您必须使用truncate
,或以只读模式打开文件,阅读,关闭,然后以只读模式打开文件。