如何将文件放入数组并保存在perl中

2024-01-11

大家好,我是 Perl 的初学者,我面临一些问题,因为我想将从 AA 到 \ 开始的字符串放入数组中并保存它。 txt 文件中有大约 2000-3000 个字符串,从相同的首字母开始,即 AA 到 / 我正在这样做,如果我错了,请纠正我。

输入文件

AA  c0001
BB  afsfjgfjgjgjflffbg
CC  table
DD  hhhfsegsksgk
EB  jksgksjs
\
AA  e0002
BB  rejwkghewhgsejkhrj
CC  chair
DD  egrhjrhojohkhkhrkfs
VB  rkgjehkrkhkh;r
\

源代码

$flag = 0
while ($line = <ifh>)
{

    if ( $line = m//\/g)
    {
        $flag = 1;
    }
    while ( $flag != 0)
    {
        for ($i = 0; $i <= 10000; $i++)
        { # Missing brace added by editor
            $array[$i] = $line;
        } # Missing brace added by editor
    }
}  # Missing close brace added by editor; position guessed!
print $ofh, $line;

close $ofh;

欢迎来到 StackOverflow。

您的代码存在多个问题。首先,请发布可编译的Perl;我必须添加三个大括号才能给它最远的编译机会,并且我必须猜测其中一个大括号去了哪里(并且有一定的机会它应该在大括号的另一侧)print我发表的声明)。

接下来,专家们有:

use warnings;
use strict;

放在脚本的顶部,因为他们知道如果不这样做就会错过一些东西。作为一名学习者,你也应该这样做,这一点至关重要;它会防止你犯错误。

有了这些,您就必须在使用变量时声明它们。

接下来,请记住缩进您的代码。这样做更容易理解。即使在最好的情况下,Perl 也可能难以理解。不要让事情变得比本来应该的更加困难。 (你可以决定你喜欢哪里的牙套——这是可以讨论的,尽管选择你喜欢的风格并坚持下去更简单,忽略任何讨论,因为讨论可能会毫无结果。)

数据中的 EB 与 VB 是否显着?很难猜测。

也不清楚你到底在追求什么。您可能正在寻找一个条目数组,文件中的每个块都有一个条目(其中块在仅包含反斜杠的行处结束),并且数组中的每个条目都是由前两个字母键入的哈希值(或第一个单词)在该行上,该行的其余部分是值。这是一个相当复杂的结构,可能超出了您在学习 Perl 的这个阶段所期望使用的结构。

你有这条线while ($line = <ifh>)。如果您以老式方式打开文件,这在 Perl 中并不是无效的,但这不是您应该学习的方式。您没有显示输出文件句柄是如何打开的,但在尝试打印时确实使用了现代表示法。然而,这里也有一个错误:

print $ofh, $line;  # Print two values to standard output
print $ofh  $line;  # Print one value  to $ofh

您需要仔细查看代码,并考虑循环逻辑。我确信你所拥有的并不是你所需要的。但是,我不确定您确实需要什么。

更简单的解决方案

来自评论:

我想标记从 AA 开始的每条记录\作为记录 0 到记录 n 并希望将其与所有记录号一起保存在一个新文件中。

那么你可能只需要:

#!/usr/bin/env perl
use strict;
use warnings;
my $recnum = 0;
while (<>)
{
    chomp;
    if (m/^\\$/)
    {
        print "$_\n";
        $recnum++;
    }
    else
    {
        print "$recnum $_\n";
    }
}

这将从命令行上指定的文件(或标准输入,如果没有)读取,并将标记的输出写入标准输出。它为除“记录结束”标记行之外的每一行添加记录编号和空格作为前缀。选择输出格式和文件处理以满足您的需求。你可能会争辩说chomp会适得其反;你当然可以在没有它的情况下编写程序。

过于复杂的解决方案

在提问者没有明确指示的情况下制定的.

这是读取数据的一种可能的方法,但它使用中等高级的 Perl(哈希引用等)。这Data::Dumper模块对于打印 Perl 数据结构也很有用(请参阅:perldoc Data::Dumper http://search.cpan.org/perldoc?Data%3a%3aDumper).

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my @data;
my $hashref = { };
my $nrecs = 0;

while (<>)
{
    chomp;
    if (m/^\\$/)
    {
        # End of group - save to data array and start new hash
        $data[$nrecs++] = $hashref;
        $hashref = { };
    }
    else
    {
        m/^([A-Z]+)\s+(.*)$/;
        $hashref->{$1} = $2;
    }
}

foreach my $i (0..$nrecs-1)
{
    print "Record $i:\n";
    foreach my $key (sort keys $data[$i])
    {
        print "  $key = $data[$i]->{$key}\n";
    }
}
print Data::Dumper->Dump([ \@data ], [ '@data' ]);

输入示例的输出示例:

Record 0:
  AA = c0001
  BB = afsfjgfjgjgjflffbg
  CC = table
  DD = hhhfsegsksgk
  EB = jksgksjs
Record 1:
  AA = e0002
  BB = rejwkghewhgsejkhrj
  CC = chair
  DD = egrhjrhojohkhkhrkfs
  VB = rkgjehkrkhkh;r
$@data = [
           {
             'EB' => 'jksgksjs',
             'CC' => 'table',
             'AA' => 'c0001',
             'BB' => 'afsfjgfjgjgjflffbg',
             'DD' => 'hhhfsegsksgk'
           },
           {
             'CC' => 'chair',
             'AA' => 'e0002',
             'VB' => 'rkgjehkrkhkh;r',
             'BB' => 'rejwkghewhgsejkhrj',
             'DD' => 'egrhjrhojohkhkhrkfs'
           }
         ];

请注意,此数据结构并未针对除记录编号之外的搜索进行优化。如果您需要以其他方式搜索数据,那么您需要以不同的方式组织它。 (在没有完全理解的情况下,不要将此代码作为答案 - 它很微妙。它也不进行错误检查;小心错误的数据。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将文件放入数组并保存在perl中 的相关文章

随机推荐