【问题标题】:Perl Read File and Split to an ArrayPerl 读取文件并拆分为数组
【发布时间】:2016-08-01 08:45:44
【问题描述】:

我有一些关于拆分成数组的问题。

我想拆分一个空行并保存到一个数组中。

1.) 首先我读取文件并保存到字符串 ($configdata)。

2.) 然后我想用空行分割字符串 ($configdata)。

我的脚本:

#!/usr/bin/perl

use strict;

my $pathconfigfile = 'config.conf';
my @configline;

open(my $configfile, "<", $pathconfigfile);

        while(<$configfile>){


                my $configdata = $_;


                my @configdata = split /\n\n/, $configdata;
                print @configdata[0] "\n";
                print @configdata[1] "\n";
                print @configdata[2] "\n";

        }
close $configfile;

配置文件:

Testingtttttttttttttttttttttttt
############################################
0987654345678909876MN09uz6t56789oiuhgölkjhgfr
0987654323456789098765fgnloiuztlkjhgfrtzuiknb

MegaMixoiuzt
############################################
09876543457890098765NSUDlkjhzgtfr67899ztz9098
098765435678987t87656789876567898765679097658

TESTINGPARTS
############################################
0987654567890098765hzzasza654567uhgdjdjfacdaa
9876545678987654mchfuiaq754567898765434567876

我的愿望结果:

打印@configdata[0];

Testingtttttttttttttttttttttttt
############################################
0987654345678909876MN09uz6t56789oiuhgölkjhgfr
0987654323456789098765fgnloiuztlkjhgfrtzuiknb

打印@configdata[1];

MegaMixoiuzt
############################################
09876543457890098765NSUDlkjhzgtfr67899ztz9098
098765435678987t87656789876567898765679097658

打印@configdata[2];

TESTINGPARTS
############################################
0987654567890098765hzzasza654567uhgdjdjfacdaa
9876545678987654mchfuiaq754567898765434567876

【问题讨论】:

    标签: arrays perl split


    【解决方案1】:

    这比你想象的要容易,如果你使用$/ - 记录分隔符。

    例如:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    use Data::Dumper;
    
    local $/ = "\n\n"; 
    #chomp removes $/ from the field)
    chomp ( my @configdata = <DATA> );
    
    print Dumper \@configdata
    
    
    __DATA__
    Testingtttttttttttttttttttttttt
    ############################################
    0987654345678909876MN09uz6t56789oiuhgölkjhgfr
    0987654323456789098765fgnloiuztlkjhgfrtzuiknb
    
    MegaMixoiuzt
    ############################################
    09876543457890098765NSUDlkjhzgtfr67899ztz9098
    098765435678987t87656789876567898765679097658
    
    TESTINGPARTS
    ############################################
    0987654567890098765hzzasza654567uhgdjdjfacdaa
    9876545678987654mchfuiaq754567898765434567876
    

    给予:

    $VAR1 = [
              'Testingtttttttttttttttttttttttt
    ############################################
    0987654345678909876MN09uz6t56789oiuhgölkjhgfr
    0987654323456789098765fgnloiuztlkjhgfrtzuiknb',
              'MegaMixoiuzt
    ############################################
    09876543457890098765NSUDlkjhzgtfr67899ztz9098
    098765435678987t87656789876567898765679097658',
              'TESTINGPARTS
    ############################################
    0987654567890098765hzzasza654567uhgdjdjfacdaa
    9876545678987654mchfuiaq754567898765434567876'
            ];
    

    或者,您可以使用map 来创建一个数组数组:

    chomp ( my @configdata = map { [split] } <DATA> );
    

    这会给你:

    $VAR1 = [
              [
                'Testingtttttttttttttttttttttttt',
                '############################################',
                '0987654345678909876MN09uz6t56789oiuhgölkjhgfr',
                '0987654323456789098765fgnloiuztlkjhgfrtzuiknb'
              ],
              [
                'MegaMixoiuzt',
                '############################################',
                '09876543457890098765NSUDlkjhzgtfr67899ztz9098',
                '098765435678987t87656789876567898765679097658'
              ],
              [
                'TESTINGPARTS',
                '############################################',
                '0987654567890098765hzzasza654567uhgdjdjfacdaa',
                '9876545678987654mchfuiaq754567898765434567876'
              ]
            ];
    

    例如

    $configdata[0][0] = 'Testingtttttttttttttttttttttttt'
    

    注意 - 我使用内联 __DATA__ 文件句柄进行说明。您将使用打开的文件句柄。 (chomp ( my @configdata = &lt;$configfile&gt; );)

    另外 - $/ 适用于 while 循环,因此 while 的每次迭代都将是您打算操作的文本块 - 因此您可以改为:

    while ( <DATA> ) { 
        chomp;
        print "Start of chunk:\n";
        print;
        print "\nEnd of chunk\n";
    }
    

    【讨论】:

    • $/ - 哇,我使用 Perl 已经很多年了,从来没有遇到过这个问题(也不需要将文件拆分成记录)但是非常有用。
    • local $/ = "";(段落模式)会更有意义。
    【解决方案2】:

    使用输入记录分隔符

    open(my $configfile, "<", $pathconfigfile) or die "$!";
    local $/;
    my @configdata  = split("\n\n",<$configfile>);
    print @configdata;
    

    【讨论】:

    • @Skydreampower 如果我的回答对你有用,请点击勾选按钮接受答案:)
    • 我不确定这是否真的算作“使用”记录分隔符,因为您将文件视为单个记录,然后将其拆分。
    【解决方案3】:
    #!/usr/bin/perl
    
    use 5.010;
    use strict;
    use warnings;
    use TrigMod;
    
    use Math::Trig;
    use Math::Round;
    
    
    print 
        'MENU
        1.  Calculate a if b and h are given.
        2.  Calculate h if a and b are given.
        3.  Calculate h if Y and a are given.
        4.  Calculate Y if h and a are given.
        ';
    print "\nEnter Option";
    my$opt=<>;
    
    
    my$a, my$b, my$h, my$Y;
    
    
    if($opt==1)
    {
        print "\nEnter base and height b,h:";
        $b=<>;
        $h=<>;
        # b=6, h=4, a=5
        $a=TrigMod::geta($b,$h);
        $Y=TrigMod::getY($a,$h);
        print "\na=$a\theight=$h\tbase=$b\tangle=$Y";
    
    }
    
    elsif($opt==2)
    {
        print "\nEnter sides a and b:";
        $a=<>;
        $b=<>;
    
        $h=TrigMod::geth_ab($a,$b);
        #a=5, b=6, h=4;
        print "\n$h";
        $Y=TrigMod::getY_ah($a,$h);
        print "\na=$a\tbase=$b\theight=$h\tangle=$Y";   
    }
    
    elsif($opt==3)
    {
        print "Enter sides a and Y in degrees:";
        $a=<>;
        $Y=<>;
    
        $h=TrigMod::geth_aY($a,$Y);
        $b=TrigMod::getb_ah($a,$h);
        print "\na=$a\tbase=$b\theight=$h\tangle=$Y";   
    }
    
    elsif($opt==4)
    {
        print "Enter sides a and h:";
        $a=<>;
        $h=<>;
    
        $Y=TrigMod::getY_ah($a,$h);
        $b=TrigMod::getb_ah($a,$h);
        print "\na=$a\tbase=$b\theight=$h\tangle=$Y";   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多