如何从 Perl 数据结构中获取数据

问题描述

我已将 JSON 解析为以下数据结构:

$VAR1 = {
          '041012020' => {
                            'item_number' => 'P2345'
                          },'041012021' => {
                            'item_number' => 'I0965'
                          },'041012022' => {
                            'item_number' => 'R2204'
                          }
        };

我正在尝试使用以下代码获取 item_numbers 的值,它为我提供了 HASH 值作为输出,而不是实际的 item_number 值。请指导我获得预期值。

foreach my $value (values %{$json_obj}) {
       say "Value is: $value,";
 }

输出

Value is: HASH(0x557ce4e2f3c0),Value is: HASH(0x557ce4e4de18),Value is: HASH(0x557ce4e4dcf8),

如果我使用相同的代码获取密钥,它就可以正常工作

foreach my $key (keys %{$json_obj}) {
        say "Key is: $key,";
 }

输出

Key is: 041012020,Key is: 041012020,Key is: 041012022,

解决方法

散列元素的值是对散列 (for my $value (values %$data) { say $value->{item_number}; } ) 的引用。这就是对引用进行字符串化时得到的结果。如果你想要项目编号,你需要告诉 Perl。

for my $item_number ( map { $_->{item_number} } values %$data ) {
   say $item_number;
}

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>
  <title>Document</title>

  <style>
    * {
      box-sizing: border-box;
    }
    
    .container {
      max-width: 520px;
      max-height: 180px;
      background-color: antiquewhite;
    }
    
    fieldset {
      max-width: 518px;
      max-height: 178px;
      padding-right: 15px;
      padding-left: 15px;
    }
    .form-group {
  margin-bottom: 1rem;
  background-color:#efeeef;
}

    .btn{
        font-weight:600;
        color:#fff;
        text-align:center;
        vertical-align:middle;
        border:1px solid transparent;
        font-size:1.2rem;
        line-height:1.5;
    }
    .btn-primary {
  color: #fff;
  background-color: #1172f4;
  border-color: #000000;
}
.btn-primary:hover {
  color: #fff;
  background-color:#1172f4;
  border-color: black;
}
.btn-primary:focus,.btn-primary.focus {
  color: #fff;
  background-color:#1172f4;
  border-color: #1875f6;
  box-shadow:none;
}
.btn-primary:active:focus {
  box-shadow:none;
}

    .form-group{
        box-shadow:none;

        
    }
    .form-control{
        border:2px solid #e2e2e2;
        display:block;
        width:100%;
        padding:.375rem;
        font-size:1rem;
        font-weight:1rem;
        line-height: 1.5;
        color:#e5e5e5;
        background-color: #efefef;
        [![appearance:none][2]][2];
        border-radius:.25rem;
        outline:0;
    }
    .form-control:focus{
        box-shadow:none;
        background-color:#efefef;
        outline:0;
      
    }
    .form-control:active{
        background-color:#efefef;
        box-shadow:none;
        outline:0;
      
    }
    .form-control:active:focus{
        box-shadow:none;
    }
    
   .form-email{
       margin-left:10px;
       margin-right:10px;
       padding-right:10px;
       width:95%;
       border:none;
       font-weight:500;
       
   }
   .form-group{
    border:1.5px solid #e3e3e3;
    border-radius:4px;
    outline: 2px #e3e3e3;
   }
  </style>

</head>

<body>
  <div class="container">
    <div class="row">

      <div class="col-sm-6 col-sm-offset-3 form-box">

        <form role="form" action method="post" class="registration-form" style="width:482px;height:175px;background-color:aqua;margin-left:5px;margin-right:5px;padding-left: 20px;padding-right: 20px;">

          <fieldset>
            <!--Start 2nd form field set-->
            <div class="form-bottom">
              <div class="form-group" style="margin-top:20px;width:100%;">

                <input type="text" name="form-email" placeholder="Enter Your email address" class="form-email form-control" id="form-email">
              </div>
              <!--End of 2nd form groupdiv-->

              <button type="button" class="btn btn-primary btn-next" style="margin-top:20px;margin-bottom:20px;padding-right:15px;width:100%;">Get Started</button>
            </div>
            <!--End of bottom div-->

          </fieldset>
          <!--End of second form fieldset-->
        </form>

</body>

</html>
,

这是您问题的简短代码。


    #!usr/bin/perl
    
    $VAR1 = {
              '041012020' => {
                                'item_number' => 'P2345'
                              },'041012021' => {
                                'item_number' => 'I0965'
                              },'041012022' => {
                                'item_number' => 'R2204'
                              }
            };
            
    print "$VAR1->{$_}->{item_number}\n" for keys %$VAR1;

在块中使用:

for my $key (keys %$VAR1) {
    print "$VAR1->{$key}->{item_number}\n"
}