2012-07-30 89 views
-1

我沒有得到的結果從下面的代碼期望:Perl的打開文件+哈希+編輯

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

我很感謝你的回答。

luis。

但是,看這個例子,在代碼my%change =(nombre =>「name」,mi =>「my」中爲「Hola,mi nombre es Luis y vivo en Argentina」文件編號改變爲80.928和320.000。 );這是結果「Hola,我的名字es路易斯體育en阿根廷a」到底,一個字更多!因爲?

+0

嗨,我需要,在文件中更改,鍵爲值,哈希 – opmeitle 2012-07-30 04:37:04

+0

您需要粘貼一些樣本從'/ home/opmeitle/labs-perl/numeros' – 2012-07-30 04:39:40

+0

我明白,但你正在閱讀輸入文件,執行一些轉換,然後寫入文件。所以除非我們知道輸入是什麼樣子,否則我們不能很好地解釋你的變換應該如何去獲得所需的輸出。通過粘貼相關輸入來編輯您的問題。 – DavidO 2012-07-30 04:39:45

回答

2

你的第一個問題是在.(點) .(點) - 在正則表達式中的意思是「任何符號」。

你在320.000第二個問題 - 這是數量和它恰好等於320

320.000 =〜S/320/380.500 /克; => 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

但當%的變化哈希寫爲my %change = ("80.928" => "85.950", "320.000" => "380.500");,輸出會320.000|80.928

第三個問題是,您以讀寫模式打開文件,但是當生成的文件的大小較小時,源文件最終會是垃圾。爲了避免這種情況,您必須使用truncate,或以只讀模式打開文件,讀取它,關閉,之後以writeonly模式打開文件。

+0

但是,看這個例子,在代碼my%change =(nombre =>「name」,mi =>「my」)中爲「Hola,mi nombre es Luis y vivo en Argentina」的文件編號80.928和320.000改變;這是結果「Hola,我的名字es路易斯體育en阿根廷 a 」最後,一個字更多!因爲? – opmeitle 2012-07-30 04:53:36

+0

這個怎麼樣:'320.000'=〜s/320。000/380.500 /克; – cdtits 2012-07-30 04:58:32

+0

我理解你的代碼,但不能用word來工作。 – opmeitle 2012-07-30 05:06:12