3

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

如果我想处理程序的输出行,如何以特殊方式格式化 THE FIRST LINE?

我想到了两种可能:

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 诗。

谢谢!

4

3 回答 3

8

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

while (my $line = <>) {
    if ($. == 1) {
        # do cool stuff here
    }
    # do normal stuff here
}
于 2009-05-21T14:39:00.350 回答
5

要以不同的方式处理第一行,您可以将

$line = <DATA>;

在你的循环上方。

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

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

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

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

于 2009-05-21T14:30:56.310 回答
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 如何与双管道一起工作。有这个 IPC::Open2 的东西,但我还没有弄清楚如何有效地使用它。欢迎提出建议。

于 2009-05-21T19:49:44.327 回答