所有值都不在循环中运行

时间:2015-09-01 06:35:24

标签: perl

我正在读取文件,然后为每个值运行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);
    }
}

4 个答案:

答案 0 :(得分:5)

您的代码需要:

  1. 使用警告; use strict;
  2. open
  3. 上的错误处理
  4. qx上的错误处理,即将其替换为system,因为您不关心输出,或者更好,File::Path::mkpath()
  5. foreach更改为while
  6. 在您的循环中添加else子句
  7. 试试这个:

    <强>输入

    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;