当您尝试打印数组或散列并且看到以下内容时,这意味着什么; 数组(0xd3888)或HASH(0xd3978)?
例
码
my @data = (
['1_TEST','1_T','1_TESTER'],
['2_TEST','2_T','2_TESTER'],
['3_TEST','3_T','3_TESTER'],
['4_TEST','4_T','4_TESTER'],
['5_TEST','5_T','5_TESTER'],
['6_TEST','6_T','^_TESTER']
);
foreach my $line (@data) {
chomp($line);
@random = split(/\|/,$line);
print "".$random[0]."".$random[1]."".$random[2]."","\n";
}
Run Code Online (Sandbox Code Playgroud)
结果
ARRAY(0xc1864)
ARRAY(0xd384c)
ARRAY(0xd3894)
ARRAY(0xd38d0)
ARRAY(0xd390c)
ARRAY(0xd3948)
Run Code Online (Sandbox Code Playgroud)
Zai*_*aid 18
很难说你是否意味着它,但你获得数组引用的原因是因为你没有打印你认为自己的东西.
你在迭代''行'时开始正确@data
:
foreach my $line (@data) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,下一行是禁止的.您似乎将文本字符串与数组结构混淆.是的,每行包含字符串,但Perl将其@data
视为数组,而不是字符串.
split
用于将字符串转换为数组.它不能在阵列上运行!同样如此chomp
(有一个无关的例外).
你要做的是用以下内容替换foreach
循环的内容:
foreach my $line (@data) {
print $line->[0].", ".$line->[1].", ".$line->[2]."\n";
}
Run Code Online (Sandbox Code Playgroud)
你会注意到->
符号,这是有原因的.$line
指的是一个数组.它本身不是一个数组.的->
箭头顺从阵列,允许访问由引用的数组的单个元素$line
.
如果您对使用箭头进行引用的想法不满意(并且大多数初学者通常不这样做),您可以创建一个临时数组,如下所示,然后使用它.
foreach my $line (@data) {
my @random = @{ $line };
print $random[0].", ".$random[1].", ".$random[2]."\n";
}
Run Code Online (Sandbox Code Playgroud)
1_TEST, 1_T, 1_TESTER
2_TEST, 2_T, 2_TESTER
3_TEST, 3_T, 3_TESTER
4_TEST, 4_T, 4_TESTER
5_TEST, 5_T, 5_TESTER
6_TEST, 6_T, ^_TESTER
Run Code Online (Sandbox Code Playgroud)
单行可能会有类似的东西print "@$_\n" for @data;
(有点OTT),但是如果你想打印数组以查看它的样子(比如说,出于调试目的),我建议使用这个Data::Dump
模块,为您打印阵列和哈希,而不必担心它太多.
只需放在use Data::Dump 'dump';
脚本的开头,然后dump @data;
.就如此容易!
这意味着你没有数组;你有一个数组的引用。
请注意,数组是用圆括号指定的 - 作为列表;当您使用方括号表示法时,您正在创建对数组的引用。
foreach my $line (@data)
{
my @array = @$line;
print "$array[0] - $array[1] - $array[2]\n";
}
Run Code Online (Sandbox Code Playgroud)
说明差异:
my @data = (
['1_TEST','1_T','1_TESTER'],
['2_TEST','2_T','2_TESTER'],
['3_TEST','3_T','3_TESTER'],
['4_TEST','4_T','4_TESTER'],
['5_TEST','5_T','5_TESTER'],
['6_TEST','6_T','^_TESTER']
);
# Original print loop
foreach my $line (@data)
{
chomp($line);
@random = split(/\|/,$line);
print "".$random[0]."".$random[1]."".$random[2]."","\n";
}
# Revised print loop
foreach my $line (@data)
{
my @array = @$line;
print "$array[0] - $array[1] - $array[2]\n";
}
Run Code Online (Sandbox Code Playgroud)
ARRAY(0x62c0f8)
ARRAY(0x649db8)
ARRAY(0x649980)
ARRAY(0x649e48)
ARRAY(0x649ec0)
ARRAY(0x649f38)
1_TEST - 1_T - 1_TESTER
2_TEST - 2_T - 2_TESTER
3_TEST - 3_T - 3_TESTER
4_TEST - 4_T - 4_TESTER
5_TEST - 5_T - 5_TESTER
6_TEST - 6_T - ^_TESTER
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9205 次 |
最近记录: |