-2

我正在为我的大学练习而苦苦挣扎...我需要从文件中读取字符串并将它们放入不同的变量中...团队,请查看并请在空闲时间回复...

输入文件:(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)*

尝试使用拆分:

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

尝试拆分后得到的输出:

211
211
4

3 回答 3

2

split返回一个列表;当您在标量上下文中使用它时$row = split(..., $row);

  1. 您只能获得分配的数组元素的数量。
  2. $row在输入中破坏了你的。

你需要更多类似的东西:

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

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

于 2014-04-28T04:37:24.530 回答
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";
于 2014-04-28T05:10:08.777 回答
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
于 2014-04-28T09:57:41.673 回答