Perl:使用基于索引的方法循环输入行

时间:2009-05-21 14:22:12

标签: perl text-processing

这是perl中的初学者最佳练习题。我是这种语言的新手。问题是:

如果我想处理程序中的输出行,我该如何以特殊方式格式化第一行?

我想到两种可能性:

1)设置第一次循环后的标志变量。但它将针对每个周期进行评估。坏的解决方案

2)基于索引的循环(如“for”)。然后我会在i = 1中启动循环。这个解决方案要好得多。问题是我该怎么办?

我刚刚找到了使用while(<>)构造循环的代码。

在这里你可以看得更清楚:

$command_string = "par-format 70j p0 s0 < " . $ARGV[0] . "|\n";                                                                                

open DATA, $command_string  or die "Couldn't execute program: $!";

print "\t    <div>&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;|-- <strong>Description</strong></div>\n";
while ( defined( my $line = <DATA> )  ) {
   chomp($line);
   # print "$line\n";
   print "\t    <div>&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;|&‎nbsp;&‎nbsp;&‎nbsp;-- " . $line  . "</div>\n";
}

close DATA;

请不要犹豫,纠正这里的任何代码,这是我的第一首perl诗。

谢谢!

3 个答案:

答案 0 :(得分:8)

您始终可以使用$.或英文名称$INPUT_LINE_NUMBER来控制循环中的逻辑:

while (my $line = <>) {
    if ($. == 1) {
        # do cool stuff here
    }
    # do normal stuff here
}

答案 1 :(得分:5)

要以不同方式处理第一行,您可以放置​​

$line = <DATA>;
循环上方的

正确检查读取问题(空文件等),这应该是

if ($line = <DATA>) {
    ...do special things...
}

while (my $line = <DATA>) {
    ...do regular things...
}

我不确定defined()电话。您可能不需要它,因为空字符串具有错误的真值。

答案 2 :(得分:4)

从“最佳实践”的角度来看,该代码示例存在很多错误:

open DATA, $command_string  or die "Couldn't execute program: $!";
  • 安全漏洞,请利用我。
  • DATA是一个神奇的值,指向当前文件末尾的__DATA__部分。
  • 您应该使用

    open my $fh 
    

    其中使用词法变量来表示文件句柄而不是全局变量。

  • 你应该使用3 arg open,即:

    open my $fh, '<'  , $filename
    open my $fh, '-|' , $command
    open my $fh, '-|' , $command, @args 
    
    遗憾的是,我还没有弄清楚3-arg如何使用双管道。 theres'这个IPC :: Open2的事情,但我还没有弄清楚如何 有效地使用它。建议欢迎。