【问题标题】:is there any way I can split the hashes in an array?有什么办法可以拆分数组中的哈希值吗?
【发布时间】:2020-10-18 10:22:04
【问题描述】:

我一直在尝试使用散列拆分数组,但出现以下错误

“在拆分中使用未初始化的值 $_”

@array = (("forest:k233356"),("wi45one:1onetothree"));
foreach(@array)
   ($id,$pwd)=split(":",$_);

从以下代码中,我无法拆分数组并将以下内容分配给$id$pwd。任何线索将不胜感激!

【问题讨论】:

  • 那些没有经过哈希处理。它们是字符串。试试($id,$pwd)=split(/:/);
  • 1) 您发布的代码不会产生您声称的消息。它甚至不编译。 2) 如果您添加代码编译所需的卷曲,它会完全按照您的意愿进行。

标签: arrays regex perl hash scripting


【解决方案1】:

一种可能的方法是:

@array = ("forest:k233356", "wi45one:1onetothree");
%hash = map {split(":",$_, 2) } @array;

@array 在这里是一个字符串数组。 mapsplit ":", $_,2 应用于数组的每个元素,这将每个字符串拆分为最多 2 个字段(如下面的评论中所述)并将结果返回给 %hash。最后,%hash 将以 ids 作为键,pwds 作为值。

如果您需要更多帮助,可以阅读:

  1. https://perldoc.perl.org/perldata.html#List-value-constructors
  2. https://perldoc.perl.org/functions/map.html
  3. https://perldoc.perl.org/functions/split.html

【讨论】:

  • 您需要 split 的第三个参数来确保您获得两个元素:split /:/, $_, 2。否则,某些字符串可能会给出 1 个或两个以上的元素,这会混淆对 %hash 的分配。
【解决方案2】:

除了您的代码没有编译(因此不可能给出您向我们展示的错误消息)这一事实之外,它非常接近正确答案。

这被轻微地清理和扩展(实际上将数据放入哈希中),但它与您开始使用的非常相似。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my %hash;
my @array = ("forest:k233356", "wi45one:1onetothree");

foreach (@array) {
  my ($id, $pwd) = split(/:/, $_, 2);

  $hash{$id} = $pwd;
}

say Dumper \%hash;

几个风格点:

  1. 我在不同的地方添加了更多的空白。
  2. 我删除了定义数组时不必要的括号。
  3. 我将split() 的第一个参数变成了正则表达式。
  4. 我添加了2 作为split() 的第三个参数,因此字符串只会被分成两部分(它与您现有的数据没有区别 - 但最好是安全的)。

这些都不会对您的代码的工作方式产生任何影响 - 它们只会让您的代码更易于阅读和理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多