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

Perl:使用基于索引的方法在输入行上循环,perl,text-processing,Perl,Text Processing,这是perl中的初学者最佳实践问题。我不熟悉这种语言。问题是: 如果要处理程序的输出行,如何以特殊方式格式化第一行 我认为有两种可能性: 1) 一个标志变量,一旦循环第一次被执行,就被设置。但将对每个周期进行评估。糟糕的解决方案 2) 基于索引的循环(如“for”)。然后我将以I=1开始循环。这个解决方案要好得多。问题是我怎么做 我刚刚找到了使用while()构造进行循环的代码 在这里您可以看到更好的: $command_string = "par-format 70j p0 s0 < "

这是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;
$command\u string=“par格式70j P0S0<”$ARGV[0]。“|\n”;
打开数据,$command_字符串或die“无法执行程序:$!”;
打印“\t”&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp;|--说明\n”;
while(已定义(my$line=)){
chomp($line);
#打印“$line\n”;
打印“\t”&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp&‎nbsp|&‎nbsp&‎nbsp&‎nbsp;-“$行。”\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解决方案不起作用,但它具有让我访问任意行的非常好的质量。我怎么能这样做呢?如果多行代码发生变化,情况可能会变得太复杂。这证明从互联网上复制粘贴代码是一种危险的做法。谢谢你的回答。