如何从文件中读取字符串并将它们拆分为不同的数组?

时间:2014-04-28 04:15:49

标签: regex perl perlscript

我正在努力学习这部分练习... 我需要从文件中读取字符串并将它们放入不同的变量中... 团队,请审核,请在您的空闲时刻回复......

输入文件:(test_ts.txt)

Test1--12:45
Test2--1:30

脚本:

use strict;
use warnings;

my $filename = "test_ts.txt";
my @name = ();
my @hrs=();
my @mins=();

open(my $fh, $filename)
  or die "Could not open file '$filename' $!";

while (my $row = <$fh>) {
  chomp $row;
  push(@name, $row);
  print "$row\n";
}

输出:

Test1--12:45
Test2--1:30

预期产出:

Test1
Test2

*(Array should have the below values
name[0]=Test1
name[1]=Test2
hrs[0]=12
hrs[1]=1
mins[0]=45
mins[1]=30)*

尝试使用Split:

while (my $row = <$fh>) {
  chomp $row;
  $row=split('--',$row);
  print $row;
  $row=split(':',$row);
  print $row;
  push(@name, $row);
  print "$row\n";
}

尝试拆分后得到的输出:

211
211

3 个答案:

答案 0 :(得分:2)

split返回一个列表;当你在$row = split(..., $row);之类的标量上下文中使用它时,那么:

  1. 您只获得已分配数组的元素数。
  2. 您在销售中销毁了$row
  3. 你需要更像的东西:

    while (my $row = <$fh>)
    {
        chomp $row;
        my @bits = split /[-:]+/, $row;
        print "@bits\n";
        push(@name, $bits[0]);
        …other pushes…
        print "$row\n";
    }
    

    您迟早需要了解标量和数组上下文。同时,将split的结果分配给数组。

答案 1 :(得分:0)

以下是基于“ - ”分割行的简单方法,然后基于“:”分割时间。希望这能帮助你。

use strict;
use warnings;

my $filename = "test_ts.pl";
my @name = ();
my @hrs=();
my @mins=();

open(my $fh, $filename)
or die "Could not open file '$filename' $!";

while (my $row = <$fh>) {
chomp $row;
my ($a,$b) = split("--", $row);
my ($c, $d) = split (":", $b);
push(@name, $a);
push(@hrs, $c);
push(@mins, $d);
}
print "$name[0]\n";
print "$name[1]\n";
print "$hrs[0]\n";

print "$hrs[1]\n";
print "$mins[0]\n";
print "$mins[1]\n";

答案 2 :(得分:0)

使用全局正则表达式有时比split更简单。这个简短的程序通过查找目标字符串中的所有字母数字字段来工作。

use strict;
use warnings;
use autodie;

open my $fh, '<', 'test_ts.txt';

my (@name, @hrs, @mins);

while (<$fh>) {
  my ($name, $hrs, $mins) = /\w+/g;
  push @name, $name;
  push @hrs, $hrs;
  push @mins, $mins;
  print "$name\n";
}

print "\n";

print "Names:   @name\n";
print "Hours:   @hrs\n";
print "Minutes: @mins\n";

<强>输出

Test1
Test2

Names:   Test1 Test2
Hours:   12 1
Minutes: 45 30