-1

我没有从以下代码中得到预期的结果:

#!/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

我很感激你的回答。

路易斯。

但是,看这个例子,在代码 my %change = ( nombre => "name", mi => "my"); 这是结果“你好,我的名字 es Luis y vivo en Argentina a”,最后一个字!因为?

4

1 回答 1

2

你的第一个问题是在.(dot) .(dot) - 在正则表达式中的意思是“任何符号”。

您在 320.000 中的第二个问题 - 这是数字,它完全等于 320

320.000 =~ s/320/380.500/g;=> 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, 或以只读模式打开文件,读取它,关闭它,然后以只写模式打开它。

于 2012-07-30T04:44:06.953 回答