Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在perl脚本中对哈希进行排序_Perl_Sorting_Hash - Fatal编程技术网

Can';t在perl脚本中对哈希进行排序

Can';t在perl脚本中对哈希进行排序,perl,sorting,hash,Perl,Sorting,Hash,我似乎无法对哈希进行排序,我在子程序的suboption4循环中使用这个foreach来对哈希进行排序。我正在尝试对它进行排序,以便它只打印用户,从USER1到USER3,而不是PASS1到PASS3。请帮助。在散列中使用带编号的键是个坏主意。如果排序很重要,那么这就是阵列的工作。如果排序不重要,并且您已经命名了键值对,那么这就是散列的工作 哦,在您的情况下-%userAndPass与$userAndPass无关使用严格使用警告会告诉你这件事的 我建议您的数据结构会更好,因为: sub hash

我似乎无法对哈希进行排序,我在子程序的suboption4循环中使用这个foreach来对哈希进行排序。我正在尝试对它进行排序,以便它只打印用户,从USER1到USER3,而不是PASS1到PASS3。请帮助。

在散列中使用带编号的键是个坏主意。如果排序很重要,那么这就是阵列的工作。如果排序不重要,并且您已经命名了键值对,那么这就是散列的工作

哦,在您的情况下-
%userAndPass
$userAndPass
无关<代码>使用严格
使用警告
会告诉你这件事的

我建议您的数据结构会更好,因为:

sub hashOfUsers
{
    %userAndPass = (); #hash to store the user and passwd, SORT hashes to view     the users of this program
    $userAndPass = {
        USER1 => 'David',
        PASS1 => 'P@ssw0rd',
        USER2 => 'Paul',
        PASS2 => 'P@ssw0rd',
        USER3 => 'Diana',
        PASS3 => 'P@ssw0rd'
      }; #users and pass hashes
}

sub option4
{
    &hashOfUsers();
    foreach $hi(sort {$userAndPass{$a} cmp $userAndPass{$b}} keys %userAndPass)
    {
        print "The users of this programs are: $userAndPass{$hi} $hi  \n";
    }
}
因为这样你就可以:

my @users = (
   {  USER => 'David',
      PASS => 'P@ssw0rd',
   },
   {  USER => 'Paul',
      PASS => 'P@ssw0rd',
   },
   {  USER => 'Diana',
      PASS => 'P@ssw0rd'
   }
);
问题是: 首先,将结构初始化为散列的标量引用,但
sort
语句希望使用(当前未初始化的)散列

就这么做吧

如果你要:

use strict;
use warnings;
foreach
语句中的
sort
函数将生成以下列表的一些变体:

  • USER1
  • USER3
  • 按随机顺序传递*
    键(它们的关联值都相同)
  • USER2
这种结构的核心问题是,您的用户名和密码只是由于您的密钥选择的偶然性而相互关联。(如果您正在为变量名或键编号,您应该停止并重新考虑。这是一种代码气味。)

重新设计: 可能不那么疯狂的结构包括:

“记录”数组: 这可以直接排序。(就像索布里克的同步解决方案一样。)

键入用户名的密码散列: 这可以用来创建一个键的排序列表,更像您的原始代码想要做的。这种结构的优点是1级较浅,但“缺点”是不能为同一个用户提供多个密码(如果您从事这类工作=/)



如果结构的当前代码嗅觉版本对您很重要,请考虑用<代码> > GRP{/^用户/}键%%Urand Pase< /Cult> < /P>替换<代码> %Usand and <代码>,这不会产生您声称的输出。具体来说,它不产生任何输出。从添加

使用strict开始;使用警告qw(全部)--始终使用这些!!!--并解决他们发现的问题。结构
$userAndPass
是给你的还是你自己编的?我建议使用一种更好的结构来存储用户名和密码……这正是我心目中的结构。然后可以这样进行排序:
foreach my$entry(sort{$a->{USER}cmp$b->{USER}}@users){print“USER:$entry->{USER};pwd:$entry->{PASS}\n”;}
use strict;
use warnings;
%userAndPass = (
    USER1 => 'David',
    PASS1 => 'P@ssw0rd',
    USER2 => 'Paul',
    PASS2 => 'P@ssw0rd',
    USER3 => 'Diana',
    PASS3 => 'P@ssw0rd'
  );
@UserAndPass = (
  {USER => 'David', PASS => 'P@ssw0rd'},
  {USER => 'Paul',  PASS => 'P@ssw0rd'},
  {USER => 'Diana', PASS => 'P@ssw0rd'},
);
%UserAndPass = (
  'David' => 'P@ssw0rd',
  'Paul'  => 'P@ssw0rd',
  'Diana' => 'P@ssw0rd',
)