Perl打开文件+哈希+编辑

时间:2012-07-30 04:21:07

标签: perl hash

我没有从以下代码得到结果:

#!/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”到底,一句话就更多了!因为?

1 个答案:

答案 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,或以只读模式打开文件,阅读,关闭,然后以只读模式打开文件。