2

私は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;
4

4 に答える 4

2

List::MoreUtils zip/mesh関数を使用できます:

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;
于 2013-02-26T13:58:25.607 に答える
2

もう1つの方法:

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);
于 2013-02-26T14:28:00.530 に答える
1

両方のリストを作成します。

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

次に、ハッシュ スライスを使用します。

my %hash;
@hash{@wTimes} = @wTemps;
于 2013-02-27T02:22:22.737 に答える
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];
}
于 2013-02-26T14:06:29.140 に答える