-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");の "Hola、mi nombre es Luis y vivoenArgentina"のファイル番号80.928と320.000が変更されています。これは結果「ホラ、私の名前はルイス・イ・ヴィヴォ・エン・アルゼンチン」であり、最後に一言で言えばもっと!なぜなら?

4

1 に答える 1

2

最初の問題は.(ドット) .(ドット)にあります-正規表現では「任意の記号」を意味します。

320.000の2番目の問題-これは数値であり、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ハッシュがとして記述されているmy %change = ( "80.928" => "85.950", "320.000" => "380.500");場合、出力は次のようになります。320.000|80.928

そして3番目の問題は、ファイルを読み取り/書き込みモードで開きますが、結果のファイルのサイズがソースよりも小さい場合、最終的にはゴミになります。これを回避するには、を使用するtruncateか、ファイルを読み取り専用モードで開き、読み取り、閉じてから、書き込み専用モードで開く必要があります。

于 2012-07-30T04:44:06.953 に答える