我正在读取文件,然后为每个值运行for循环。我的脚本在执行第一个值后停止。 file_detail.txt有多行。但它没有进入下一个价值。我的脚本看起来像这样 -
open (my $fh, "<", "$mycrdir/file_detail.txt" );
foreach(my $value = <$fh>) {
chomp($value);
if ($value eq "abc") {
qx/"mkdir $mydir"/;
func1($mycrnum,$mydir,$value,%envparams);
func2($mycrnum,$mydir,$value,%envparams);
}
elsif($value eq "123")
{
qx/"mkdir $mydir"/;
func1($mycrnum,$mydir,$value,%envparams);
func2($mycrnum,$mydir,$value,%envparams);
}
}
答案 0 :(得分:5)
您的代码需要:
open
qx
上的错误处理,即将其替换为system
,因为您不关心输出,或者更好,File::Path::mkpath()
foreach
更改为while
else
子句试试这个:
<强>输入强>
123
456
abc
def
<强>程序强>
#!/usr/bin/env perl
use strict;
use warnings;
use File::Path qw( make_path );
my ($mycrnum, $mydir, %envparams);
$mydir = 'bar';
my $file = "foo.txt";
open (my $fh, "<", "$file")
or die "Unable to open '$file' : $!";
while(my $value = <$fh>) {
chomp($value);
print "Value is '$value'\n";
if ($value eq "abc") {
unless (-d $mydir) {
make_path($mydir)
or die "Unable to mkdir '$mydir'";
}
func1($mycrnum,$mydir,$value,%envparams);
func2($mycrnum,$mydir,$value,%envparams);
}
elsif($value eq "123")
{
unless (-d $mydir) {
make_path($mydir)
or die "Unable to mkdir '$mydir'";
}
func1($mycrnum,$mydir,$value,%envparams);
func2($mycrnum,$mydir,$value,%envparams);
}
else {
print "Don't know what to do with line '$value'\n";
}
}
sub func1 {
print "You called func1\n";
}
sub func2 {
print "You called func2\n";
}
<强>输出强>
Value is '123'
You called func1
You called func2
Value is '456'
Don't know what to do with line '456'
Value is 'abc'
You called func1
You called func2
Value is 'def'
Don't know what to do with line 'def'
答案 1 :(得分:3)
将您的foreach
更改为while
。
my $value = <$fh>
返回单个值,这是文件的第一行。 foreach
然后接收该单个值并仅循环该值,之后循环终止而不从$fh
读取下一行。
答案 2 :(得分:0)
要么像Dave提到的那样使用while循环,要么将数据放入数组中,然后使用foreach循环遍历数组。
use IO::All;
my @lines = io($filename)->slurp;
foreach (@lines){
#work on each line
}
答案 3 :(得分:0)
也许,这是另一种解决方案,如果我的意思是问题......
open FH, "$mycrdir/file_detail.txt" || die $!;
while(<$FH>) {
chomp;
if (/^abc$/) {
...
}
elsif(/^123$/) {
...
}
}
close FH;