【问题标题】:All values are not run in a loop并非所有值都在循环中运行
【发布时间】:2015-11-26 07:13:55
【问题描述】:

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

【问题讨论】:

  • 函数func1()func2()是做什么的?
  • 还有你的数据文件是什么样的?
  • 你可能想看看这个问题的答案:stackoverflow.com/questions/585341/…
  • 请显示您在代码中引用的数据文件(file_detail.txt)的内容。

标签: perl


【解决方案1】:

您的代码需要:

  1. 使用警告;使用严格;
  2. open 上的错误处理
  3. qx 上的错误处理,即用system 替换它,因为你不关心输出,或者更好的是,用File::Path::mkpath()
  4. foreach 更改为while
  5. 在循环中添加 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'

【讨论】:

  • 感谢您提供详细信息。我是打开的错误处理。对于其他人,我遵循了您的建议。我试过了,但在第一次执行后它也退出了。我在 while 内部使用了定义,现在它正在工作。感谢所有帮助和详细信息。
  • @parthodas:你不需要打电话给definedwhile ( my $value = &lt;$fh&gt; ) { ... } 为你做,而且效果很好
【解决方案2】:

将您的 foreach 更改为 while

my $value = &lt;$fh&gt; 返回一个值,即文件的第一行。然后foreach 接收该单个值并仅循环该值,之后循环终止而不从$fh 读取下一行。

【讨论】:

    【解决方案3】:

    要么使用 Dave 提到的 while 循环,要么将文件放入数组中,然后使用 foreach 遍历数组。

    use IO::All;
    
    my @lines = io($filename)->slurp;
    
    foreach (@lines){
        #work on each line
    }
    

    【讨论】:

      【解决方案4】:

      也许,这是另一个解决方案,如果我的意思很好的话......

      open FH, "$mycrdir/file_detail.txt" || die $!;
      while(<$FH>) {
          chomp;
          if (/^abc$/) {
              ...
          }
          elsif(/^123$/) {
              ...
          }
      }
      close FH;
      

      【讨论】:

        猜你喜欢
        • 2017-07-15
        • 2019-05-16
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 2021-06-29
        • 2016-01-02
        • 1970-01-01
        • 2022-11-12
        相关资源
        最近更新 更多