gpt4 book ai didi

perl:确定字符串数组大小的方法似乎不起作用

转载 作者:行者123 更新时间:2023-12-05 01:05:42 29 4
gpt4 key购买 nike

大约三天前才开始学习 perl。

我有一个从文本文件加载的字符串数组,因此:

my @fileContents;
my $fileDb = 'junk.txt';
open(my $fmdb, '<', $fileDb);
push @fileContents, [ <$fmdb> ];

已知该文件有 1205 行长,但我无法检索数组的大小,即加载到数组中的行数。

我尝试了此处和其他地方描述的关于如何确定字符串数组中元素数量的三种不同方法,但似乎无法使它们中的任何一种工作。

以下是我的代码,注释包括我在研究中发现的三种不同方法,以查找数组中的元素数量。
#!/usr/bin/perl
#
# Load the contents of a text file into an array, one line per array element.

# Standard header stuff.
# Require perl 5.10.1 or later, and check for some typos and program errors.
#
use v5.10.1;
use warnings;
use strict;

# Declare an array of strings to hold the contents of the files.
#
my @fileContents;

# Declare and open the file.
#
my $fileDb = 'junk.txt'; # a 1205-line text file

open(my $fmdb, '<', $fileDb) or die "cannot open input file $!";

# Get the size of the array before loading it from the file.
# That size should be zero and is correctly reported as such.
#
my $sizeBeforeLoading = @fileContents;
say "size of fileContents before loading is $sizeBeforeLoading.";

# Load the file into the array then close the file.
#
push @fileContents, [ <$fmdb> ];

close( $fmdb );

# Now the array size should be 1205 but I can't get it to report that.
# Tried it three different ways.

my $sizeAfterLoading = @fileContents;
say "size of fileContents after loading is $sizeAfterLoading.";
#
# That didn't work; it reports a size of 1 when the real size is known to be 1205.
#
# Tried this:

$sizeAfterLoading = scalar @fileContents;
say "size of fileContents after loading is $sizeAfterLoading.";
#
# This one reported a size of 1.

$sizeAfterLoading = $#fileContents + 1;
say "size of fileContents after loading is $sizeAfterLoading.";
#
# This one reported an index of 0 for a size of 1.

# The real size is known to be 1205 so hard-code one less than that here
#
$sizeAfterLoading = 1204;

say "The file contents are:";

foreach my $i( 0..$sizeAfterLoading )
{
print $fileContents[ 0 ][ $i ];
}
#
# The contents of the fileContents array prints out correctly (all 1205 lines of text).

打印出数组的内容并将其与输入文件匹配可以验证数组是否正确加载(甚至将输出重定向到文件并使用 diff 与输入文件进行比较并且它们匹配),但我仍然无法获取数组大小(文本行数)。

我的猜测是必须将 $fileContents 作为二维数组访问与它有关。我最初希望只能说“打印 $fileContents[$i];”但这没有用;我需要在 [$i] 之前插入 [0]。我真的不明白这是为什么。

有人可以帮助我理解为什么数组大小不起作用,以及如何在这种情况下以正确的方式做到这一点?

最佳答案

你好像是把整个文件加载到一个数组引用中,然后把这个数组引用存到一个数组中,然后你检查一下数组的大小,当然是1。

push @fileContents, [ <$fmdb> ];
# ^---------^--- creates array ref

你想要的是:
push @fileContents, <$fmdb>;

或者为什么不
@fileContents = <$fmdb>;

如果您确实有一个多维数组,并且想要检查其中一个内部数组的大小,您要做的是首先正确地取消引用它:
my $size = @{ $fileContents[0] };  # check size of first array

需要明确的是,您所做的是:
my @file = <$fmdb>;        # store file in array
my @fileContent = \@file; # store array in other array
my $size = @fileContent; # = 1 only contains one element: a reference to @file

关于perl:确定字符串数组大小的方法似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21069076/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com