Perl:使用基于索引的方法在输入行上循环
这是perl中的初学者最佳实践问题。我不熟悉这种语言。问题是: 如果要处理程序的输出行,如何以特殊方式格式化第一行 我认为有两种可能性: 1) 一个标志变量,一旦循环第一次被执行,就被设置。但将对每个周期进行评估。糟糕的解决方案 2) 基于索引的循环(如“for”)。然后我将以I=1开始循环。这个解决方案要好得多。问题是我怎么做 我刚刚找到了使用while()构造进行循环的代码 在这里您可以看到更好的:Perl:使用基于索引的方法在输入行上循环,perl,text-processing,Perl,Text Processing,这是perl中的初学者最佳实践问题。我不熟悉这种语言。问题是: 如果要处理程序的输出行,如何以特殊方式格式化第一行 我认为有两种可能性: 1) 一个标志变量,一旦循环第一次被执行,就被设置。但将对每个周期进行评估。糟糕的解决方案 2) 基于索引的循环(如“for”)。然后我将以I=1开始循环。这个解决方案要好得多。问题是我怎么做 我刚刚找到了使用while()构造进行循环的代码 在这里您可以看到更好的: $command_string = "par-format 70j p0 s0 < "
$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;
$command\u string=“par格式70j P0S0<”$ARGV[0]。“|\n”;
打开数据,$command_字符串或die“无法执行程序:$!”;
打印“\t”          ;|--说明\n”;
while(已定义(my$line=)){
chomp($line);
#打印“$line\n”;
打印“\t”          |   ;-“$行。”\n”;
}
封闭数据;
请不要犹豫,在这里更正任何代码,这是我的第一首perl诗
谢谢 要以不同方式处理第一行,您可以
$line = <DATA>;
$line=;
在你的循环之上
通过正确检查读取问题(空文件等),应该
if ($line = <DATA>) {
...do special things...
}
while (my $line = <DATA>) {
...do regular things...
}
if($line=){
…做一些特别的事情。。。
}
while(我的$line=){
…做常规的事情。。。
}
我不确定
defined()
调用。您可能不需要它,因为空字符串有一个假真值。您可以始终使用$。
或英文名称$INPUT\u LINE\u NUMBER
来控制循环中的逻辑:
while (my $line = <>) {
if ($. == 1) {
# do cool stuff here
}
# do normal stuff here
}
while(我的$line=){
如果($。==1){
#在这里做些很酷的事情
}
#在这里做正常的事情
}
从“最佳实践”的角度来看,该代码示例有很多错误:
open DATA, $command_string or die "Couldn't execute program: $!";
- 安全漏洞,请利用我李>
- 数据是一个神奇的值,它指向当前文件末尾的
部分\uuu DATA\uu
- 你应该使用
它对文件句柄使用词法变量,而不是全局变量open my $fh
- 您应该使用3 arg open,即:
open my $fh, '<' , $filename open my $fh, '-|' , $command open my $fh, '-|' , $command, @args
打开我的$fh,'有趣,用&;不起作用。我闻到一个错误是如此。谁能给我一个类似的解决方案,我可以用fifo的领带!警告:现在有U+200e字符在那里欺骗SO的格式化程序,使其不吮吸。复制粘贴上述代码不太可能按预期工作,并且可能会在页面上打印文字:)定义的()调用是不必要的-请参阅“man perlop”-当您执行while()时,Perl会隐式添加它。您需要在if中定义调用,但不需要在while中定义调用,当函数为readline(aka)、glob(也称为aka)或readdir.yep时,虽然有一点魔力可以测试定义性而不是真实性,但这是第一种方法。我更喜欢第二种,但这是解决问题的方法。谢谢我想如果这是因为这是一个更好的方法,不是吗?嗯。。。但是,虽然TIE解决方案不起作用,但它具有让我访问任意行的非常好的质量。我怎么能这样做呢?如果多行代码发生变化,情况可能会变得太复杂。这证明从互联网上复制粘贴代码是一种危险的做法。谢谢你的回答。