Frage

Ich habe eine Datei, die enthält:

foo1 = 1

foo2 =  2

foo3 =    8

.
.
.

Ich brauche nur die Werte (1,2,8 ...) in dieser Datei mit einem Teil eines Speicher Hash-Werte, die mit den gleichen Tasten ersetzen (foo1 -> 33, foo2 -> 44, foo3. ..) Wie kann ich es ändern, um den „s ///“ Operator? Wenn es andere elegante Art und Weise ist es zu führen, werde ich glücklich sein zu wissen.

Vielen Dank für jede Hilfe,

Yohad.

War es hilfreich?

Lösung

eine Art und Weise

%hash = ("foo1"=>33,"foo2" => 44,"foo3"=>99);
while (<>){
  chomp;
  ( $one , $two ) = split /\s+=\s+/, $_;
  print "$one = $hash{$one} \n"
}

Andere Tipps

my %new_values = ( foo1 => 33, ... );
$data =~ s{^(?<key>\w+) = \K(?<old_value>.+)$}
          {$new_values{$+{key}}}gem;

Der Schlüssel ist die „e“ Flagge, die Sie Code ermöglicht die Ausführung von dem Austausch zu bestimmen. Die (?<...>) Syntax erhöht die Lesbarkeit und die \K ermöglicht es uns, die gesamte Linie entsprechen, sondern nur den Wert Bereich ersetzen. Das „g“ Flag wiederholt die Substitution so oft wie möglich, und die „m“ Flag macht ^...$ anstelle des gesamten Strangs eine Linie entsprechen. (Die g und m werden wahrscheinlich nicht notwendig sein, wenn Sie die Zeilen aufgeteilt vor der Anwendung des regexp.)

Hier ist ein

%h = ("foo1"=>3, "foo2"=>5);
while (<>)
{
    #Substitute value according to expression on right hand side
    s/(\w+) = .*/$1 . " = ". $h{$1}/e;
    print;
}

s / regexPattern / replacementPattern / Flags

"Ich bin ein String"

s / \ sam / 's / g

"Ich bin ein String"

http://gnosis.cx/publish/programming/regular_expressions.html

Ich kann wirklich nicht verstehen, was Sie basiert auf dem descriptoin tun. Können Sie Probe Eingang und Ausgang zur Verfügung stellen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top