2013-02-26 5 views
2

나는 두 개의 문자열을 가지고 :두 문자열을 펄에서 해시로 변환하려면 어떻게해야합니까?

my $wTime = "00:00-06:00/06:00-09:00/09:00-17:00/17:00-23:00/23:00-00:00"; 
my $wTemp = "17.0 °C/21.0 °C/17.0 °C/21.0 °C/17.0 °C"; 
나는 각 척도의 첫 번째 부분은 핵심 해시, 예를 들어, 이러한 문자열을 가입하고자하는

: 나는 몇 가지 변종을 시도

$hash = (
    "00:00" => "17.0 °C", 
    "06:00" => "21.0 °C", 
    "09:00" => "17.0 °C", 
    "17:00" => "21.0 °C", 
    "23:00" => "17.0 °C" 
); 

지도 및 분할의하지만 난있어 몇 가지 이상한 결과 ;-)

%hash = map {split /\s*\/\s*/, $_ } split /-/, $wTime; 
+1

안녕하십니까. 이것은 좋은 첫 번째 질문입니다. 당신이 시도한'맵'과'스플릿'것들 중 일부를 보여 주면 좋을 것입니다. 사람들이 그들을 지적 할 수있는 경우에만 실수에서 배울 수 있습니다. ;-) – simbabque

+0

나는 전에 말했듯이 : 나는 $ wTime을 예를 들어 와서 나누려고 노력했다. '% hash = map {split/\ s * \/\ s * /, $ _} split/-, $ wTime; '하지만 이것은 타임 스트링을 키로 나눕니다. 거기에 내가 시도한 또 다른 변종이 있습니다. – user2111402

+1

나는 이것을 귀하의 질문에 추가했습니다. 직접 질문을 편집 할 수도 있습니다. – simbabque

답변

2

사용할 수 List::MoreUtilszip/mesh function :

my @time_ranges = split '/', $wTime; 
my @times = map { (split '-', $_)[0] } @time_ranges; 
my @temps = split '/', $wTemp; 

use List::MoreUtils qw(zip); 
my %hash = zip @times, @temps; 
+0

답장을 보내 주셔서 감사합니다. 나는 잊어 버렸다 : 다른 어떤 모듈도없이. – user2111402

1

다음은 List :: MoreUtils가없는 자세한 솔루션입니다.

my $wTime = "00:00-06:00/06:00-09:00/09:00-17:00/17:00-23:00/23:00-00:00"; 
my $wTemp = "17.0 °C/21.0 °C/17.0 °C/21.0 °C/17.0 °C"; 

my @time = map { (split /-/, $_)[0] } split m!/!, $wTime; 
my @temp = split m!/!, $wTemp; 

my %hash; 
for (my $i=0; $i <= $#time; $i++) { # Iterate the times via their index... 
    # This only works if we have an equal number of temps and times of course. 
    $hash{$time[$i]} = $temp[$i]; 
} 
+0

이 작동하지만 완전히 아닙니다! :-) 마지막 타임 스케일'23 : 00-00 : 00'은 무시됩니다. – user2111402

+3

for 루프에서'<$ # time'은'<= $ # time' 또는'<@ time' 중 하나 여야합니다 – TLP

+0

빙고 ... :-) 나는 이것을 간과했습니다! 감사! – user2111402

2

또 하나 개의 방법 :

my $wTime = "00:00-06:00/06:00-09:00/09:00-17:00/17:00-23:00/23:00-00:00"; 
my $wTemp = "17.0 °C/21.0 °C/17.0 °C/21.0 °C/17.0 °C"; 

my %h1; 
@h1{$wTime=~/([\d:]+)-/g}=split(m!/!,$wTemp); 
+0

한 줄로 작성할 수없는 불행 (예 : 성명) – Xaerxess

+2

@Xaerxess, 할 수 있습니다. 'my % h1 = do {my % h; @h {...} = ...; % h};'. 'do' 나';'를 사용하지 않는 방법이 있습니다. – ikegami

+0

예, 가끔'할 일 '을 사용합니다.) 한 줄에 모든 것을 넣는 Perl의 힘을 과소 평가하지 마십시오 ... – Xaerxess

1

두 목록을 만듭니다.

my @wTimes = map /([^-]+)/, split qr{/}, $wTime; 
my @wTemps = split qr{/}, $wTemp; 

그런 다음 해시 조각을 사용하십시오.

my %hash; 
@hash{@wTimes} = @wTemps; 
관련 문제