【问题标题】:How can I convert two strings to a hash in perl?如何在 perl 中将两个字符串转换为哈希?
【发布时间】:2013-02-12 00:11:31
【问题描述】:

我有两个字符串:

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"
);

我尝试了一些 map 和 split 的变体,但我得到了一些神秘的结果 ;-)

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

【问题讨论】:

  • 欢迎来到 SO。这是一个很好的第一个问题。如果你能展示一些你尝试过的mapsplit 的东西会更好。只有人们能够指出错误,您才能从错误中吸取教训。 ;-)
  • 正如我之前所说:我尝试将 $wTime 与例如%hash = map {split /\s*\/\s*/, $_ } split /-/, $wTime; 但这会将每个时间字符串拆分为一个键。我也尝试过其他一些变体。
  • 我冒昧地将此添加到您的问题中。你也可以自己edit你的问题。

标签: string perl hash map split


【解决方案1】:

你可以使用List::MoreUtils zip / 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;

【讨论】:

  • 感谢您的回复。我忘记了:没有任何其他模块。
【解决方案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);

【讨论】:

  • 很遗憾你不能在一行中(即语句);)
  • @Xaerxess,当然可以。 my %h1 = do { my %h; @h{...}=...; %h };。有一些方法可以不用do;
  • 是的,我有时使用do ;) 永远不要低估 Perl 将所有内容放在一行中的能力...
【解决方案3】:

这是一个没有 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];
}

【讨论】:

  • 这可行,但不完全! :-) 最后一个时间刻度 23:00-00:00 被忽略。
  • &lt;$#time 在 for 循环中应该是 &lt;=$#time&lt;@time
  • 您也可以考虑@hash{@time} = @temp,使用哈希切片分配。
  • @TLP 会更糟,但为了演示,我会坚持使用这个解决方案。 ;-)
【解决方案4】:

创建两个列表。

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

然后使用哈希切片。

my %hash;
@hash{@wTimes} = @wTemps;

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 2019-03-07
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2020-01-02
    • 2012-11-11
    • 2014-09-24
    相关资源
    最近更新 更多