除非我正在阅读的代码,否则下一步需要进一步理解

时间:2016-12-02 20:00:44

标签: perl

我正在阅读此代码中的2件事需要帮助。首先,我是否在while循环中看到这个以读取文件:

wile(<filename>){
 next unless (/\w/);
 chomp;
 s/^\s*//;
 s/^\s*$//;
 my($name, $datatype, $io, $dummy) = split /\s*,\s*/, $_, 4;
}

所以,我想知道那是做什么的?因为正在读取同一行中的逗号,所以逗号不会进入下一次迭代吗?那么,如果在读取逗号时进行另一次迭代,它会如何拆分行?

另一个我被踩的是:

while (<AP>) {
   chomp;
   s/
//g;
}

我不知道那个代码实际上代替了什么...

谢谢!

1 个答案:

答案 0 :(得分:1)

第一个片段:

  1. 从名为filename的文件句柄中读取一行。对于文件句柄来说,这是一个非常糟糕的名称
  2. 如果该行上没有单个\w字符),则会跳过处理。
    next unless (/\w/);next if not (/\w/)相同。请注意,不需要括号 - next unless /\w/;没问题 字符来自perlretut

      

    \w匹配单词字符(字母数字或_),不仅仅是[0-9a-zA-Z_],还有非罗马字母的数字和字符

  3. 它会删除(仅)带有chomp的换行符。然后它删除前导空格,如果有的话

  4. 删除空行,其中只有空格
  5. 它用逗号分隔行,允许它们在之前和/或之后有空格。它还将返回的术语数量限制为4。这意味着它返回前三个以逗号分隔的字段,然后将所有其余字段作为列表最后一个元素中的一个字符串
  6. 第二个片段非常糟糕,无论它的意图是什么。 (删除行上的空格?)

    评论

    使用词法文件句柄,而不是使用裸名称要好得多。所以你打开一个文件

    open my $fh, '<', $filename or die "Can't open $filename: $!";
    

    并按while (my $line = <$fh>)while (<$fh>)阅读。

    通常情况下,如果只有空格

    ,你会看到跳过的行
    next unless /\S/;  # or
    next if /^\s*$/;
    

    使用\w也会跳过包含某些字符的行(除了\w匹配的字符之外的行),这意味着最好能够确定可以跳过这些字符。

    这里可能意味着跳过一行逗号,但没有\w(逗号与\w不匹配),split将返回空格(或空字符串)一个列表。我发现这有点隐藏和脆弱。我只删除带空格的行,并在处理时处理可能的松散逗号。就目前而言,无论如何它对,,a,没有帮助,产生('', '', 'a')的是什么。因此,无论如何都可能需要进行检查。

    请注意,此代码总是留下尾随空格。当使用可选的第四个参数调用split时,它会保留所有空格,否则它们不会被删除。