Perl:如何在哈希中访问数组

时间:2016-10-27 07:50:03

标签: arrays perl hash nested

我有一个带有数组的示例哈希,但是我访问数组元素的方式似乎不对。我是这样做的:

@foreach($project->houseTypes as $houseTypes)
    @foreach($houseTypes->types as $types)
        @foreach($types->houses->sortBy('bnr') as $house)
            <tr class="table-row">
                <td>{{$house->bnr}}</td>
                <td>{{$house->type->houseType->title}}</td>
                <td>{{$house->type->rooms}}</td>
                <td>&euro;{{$house->price}}</td>
                <td>{{$house->living_surface}}m<sup>2</sup></td>
                <td>{{$house->water}}m<sup>2</sup></td>
                <td>{{$house->location}}</td>
            </tr>
        @endforeach
    @endforeach
@endforeach

应该打印出“value-3”,但它没有。

3 个答案:

答案 0 :(得分:3)

您的哈希中没有数组。你有一个清单。请记住以下几点:

  • 列表与Perl中的数组不同
  • 列表是扁平结构
  • 数组是列表

如果将数组放入列表中,它将被视为另一个列表,列表是平的:

(1, 2, (3, 4, 5), (6, (7)))

等于

(1, 2, 3, 4, 5, 6, 7)

如果要构建更复杂的数据结构,则需要使用引用。有两种方法可以作为参考。您可以使用\这样的

来引用变量
my @foo = qw(a b c);
my $ref = \@foo;

或直接将其构建为匿名引用,然后将其分配给变量。

my $ref = [ qw(a b c) ];
my $ref2 = [ 1, 2, 3 ];

要制作哈希引用,请使用花括号{}

my $ref = { a => 1, b => 2 };

引用是标量值,因此它们本身只是一个单值。这就是为什么你需要取消引用它们以获得内部内部的价值的原因(实际上它不在里面,它是引用)。

%Hash_Object = (
  "Property1","value-1",
  "Property2",["value-2","value-3"]
);
$Hash_Object{Property2}[1];
$Hash_Object{Property2}->[1]; # or like this with ->

你已经知道如何做到这一点。您还可以在每个新的取消引用前使用->运算符。有些人发现阅读更清楚。

有关详细信息,请参阅perlreftut和perlref以及Mike Friedman's excellent blog post about lists and arrays

您的示例代码编写得不是很好。这是一些改进。

  • 变量名称应为小写
  • 使用 fat逗号 =>进行哈希分配
  • 如果您不进行插值,则不需要双引号""
  • 总是在最后一个元素
  • 之后添加逗号
  • 不要为它们的类型命名,为它们所代表的内容命名
  • 哈希不是对象
  • 在声明新变量时需要使用my

my %example = (
    Property1 => 'value-1',
    Property2 => [
        'value-2',
        'value-3',
    ],
);

答案 1 :(得分:2)

始终在程序顶部使用使用警告; 使用严格;

如果使用此功能,则会显示以下错误

    /* Draw Bitmap everytime I touch the screen */
    public void DrawMarker(List<Coordinates> coords){
        Canvas canvas = surfaceHolder.lockCanvas();
        for(int i=0; i < coords.size(); i++) {
            canvas.drawBitmap(bitmap, coords.get(i).coordX, coords.get(i).coordY, paint);
        }
        surfaceHolder.unlockCanvasAndPost(canvas);
     }

在perl中,列表在一起展平

所以第一个错误是

Odd number of elements in hash assignment at array.pl line 3.
Can't use string ("value-2") as an ARRAY ref while "strict refs" in use at array.pl line 8

哈希必须有成对的键和值。所以哈希的元素不应该是奇数。

您的代码应为

Odd number of elements in hash assignment at array.pl line 3

答案 2 :(得分:0)

数组值应该放在方括号中,谢谢simbabque

%Hash_Object = (
  "Property1","value-1",
  "Property2",["value-2","value-3"]
);

print $Hash_Object{Property2}[1];