我使用下面的命令来查找数组的大小
$size_x = @x;
或
$size_x = $#x+1 ;
当我在简单的声明中使用时,两者都运行良好。但是当我在循环中使用它们时,大小会变大一个数字。为什么会以这种方式发生。以下是示例:
for ($i=1;$i<=10;$i++){
if (1**2+2**2>=1){
@x[$i] =2+3;
$size_x = @x;
}
print "my size is $size_x\n";
}
这是结果:
my size is 2
my size is 3
my size is 4
my size is 5
my size is 6
my size is 7
my size is 8
my size is 9
my size is 10
my size is 11
我认为答案应该是1到10而不是2到11。什么是更好地获得正确尺寸的方法?谢谢。
答案 0 :(得分:2)
在阅读完代码之后,老实说我无法弄清楚你在这里要做什么,但如果你想创建一个包含11个元素的数组并将它们全部分配给5
,除了第一个,然后你做得很好。也许有助于查看您创建的数组的可视化:
[undef, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
如果那是真的你所希望的,那么有更快/更简单/更好的方法来做同样的事情,但我必须相信你正在努力完成别的事情。在最基本的层面上,arrays in Perl are 0-indexed:
正常数组是按编号索引的标量的有序列表,从开始 用0。
话虽如此,你很少在Perl代码中看到C风格的for
循环,那是因为它很少需要。更常见的是,您会看到类似的内容:
for (0 .. 9) {
# do something...
}
该代码使用foreach
- 样式循环和range operator(..
)生成序列(从技术上讲,从左到右的值列表,向上计数一个) 。足够的循环。让我们来谈谈你的奇怪逻辑。
1 2 + 2 2 总是为5,总是大于1。同样适用于2 + 3.这段代码没有任何动态,这就是为什么我不得不认为你打算在计算中以某种方式使用循环迭代器。否则,您可以轻松地在一行中填充10个元素的数组:
my @x = (5) x 10;
现在,最后一点适用于此代码和您从此前写的所有Perl代码。每个文件must include顶部有以下两行:
use strict;
use warnings;
答案 1 :(得分:1)
我认为Perl数组基于零,这意味着第一个元素在索引0处存储和访问。这是你的for
循环:
for ($i=1; $i<=10; $i++) {
if (1**2+2**2>=1) {
@x[$i] =2+3;
$size_x = @x;
}
print "my size is $size_x\n";
}
当您进行第一次赋值@x[1] = 2 + 3
时,数组被认为已经在位置零处有一个(空)元素,因此返回的大小为2。
避免此问题发生的最简单方法是重构for
循环以从索引0开始:
for ($i=0; $i<10; $i++) {
...
}
答案 2 :(得分:1)
从1开始索引时,大小会自动增加1.尝试从0开始索引或
@x[$i-1] =2+3;
答案 3 :(得分:-1)
正如旁注:
Perl中的数组元素用起始$表示,而不是@。
因此@x
是整个数组,而$x[$i]
是数组$i
的{{1}}'元素。
@x
应警告此事。
(我知道这不仅仅是一个评论,而是一个答案,但作为一个新手,我还没有被允许发表评论。抱歉。)