2016-07-27 11 views
2
my %colorfigshash =(); 
my $tempcnt = <DATA>; 
while($tempcnt=~m/Placement of Figure (?:[^\{]*)\{([^\{\}]*)\} Page ([^\n]*)\n/sg) 
{ 
    $colorfigshash{$1} = $2; 
} 

use Data::Dumper; 
print Dumper \%colorfigshash; 

__DATA__ 
Placement of Figure \hbox {10.7} Page 216 
Pages in Color: 216 
Placement of Figure \hbox {10.7} Page 217 
Pages in Color: 217 

Stromausgang:In Hashes Taste, um den Wert in den vorherigen Schlüssel in Perl-Skript dupliziert beitreten

$VAR1 = { 
     '10.7' => '216' 
    }; 

Erwartete Ausgabe

$VAR1 = { 
     '10.7' => '216-217' 
    }; 

Wie können wir die Werte mit vorherigen, wenn die fusionieren Schlüssel werden dupliziert. Wenn die Schlüssel den letzten in der Hash-Tabelle gespeicherten Wert dupliziert haben. Jeder könnte einen Weg zu lösen geben, auch das wäre willkommen.

+0

Ist das nicht Ihre aktuelle Ausgabe '10.7' =>‚217'? – xxfelixxx

+0

'$ VAR1 = { '10 .7 '=>' 216 ​​' };' – ssr1012

+1

Die Strategie besteht darin, die Werte auf ein mit' $ 1 'indiziertes Array zu übertragen. Dann können Sie die Werte im Array verarbeiten, um eine freundlichere Zeichenfolge zu erzeugen. Sie können @ {$ colorfigshash {$ 1}}, $ 2; 'drücken – xxfelixxx

Antwort

3

würde ich einen Hash von Arrays verwenden und neu schreiben, es in diese Richtung:

use strict; 
use warnings; 

my %colorfigshash; 

while(<DATA>) { 
    chomp; 
    next unless /^Placement/; 
    my ($placement) = /\{(\d+\.\d+)\}/; 
    my ($page) = /Page (\d+)/; 
    push @{$colorfigshash{$placement}}, $page; 
} 

for (keys %colorfigshash){ 
    print "$_ "; 
    print join ('-', @{$colorfigshash{$_}}), "\n"; 
} 

__DATA__ 
Placement of Figure \hbox {10.7} Page 216 
Pages in Color: 216 
Placement of Figure \hbox {10.7} Page 217 
Pages in Color: 217 

10.7 216-217