这是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>          |-- <strong>Description</strong></div>\n";
while ( defined( my $line = <DATA> ) ) {
chomp($line);
# print "$line\n";
print "\t <div>          |   -- " . $line . "</div>\n";
}
close DATA;
请不要犹豫,纠正这里的任何代码,这是我的第一首perl诗。
谢谢!
答案 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__
部分。您应该使用
open my $fh
其中使用词法变量来表示文件句柄而不是全局变量。
你应该使用3 arg open,即:
open my $fh, '<' , $filename
open my $fh, '-|' , $command
open my $fh, '-|' , $command, @args
遗憾的是,我还没有弄清楚3-arg如何使用双管道。
theres'这个IPC :: Open2的事情,但我还没有弄清楚如何
有效地使用它。建议欢迎。