Perl 除非代码I';我在读书

Perl 除非代码I';我在读书,perl,Perl,关于我正在阅读的代码,我需要两方面的帮助。首先,我一直在while循环中看到以下内容以读取文件: wile(<filename>){ next unless (/\w/); chomp; s/^\s*//; s/^\s*$//; my($name, $datatype, $io, $dummy) = split /\s*,\s*/, $_, 4; } wile(){ 下一个,除非(/\w/); 咀嚼; s/^\s*/; s/^\s*$/; 我的($name,$dataty

关于我正在阅读的代码,我需要两方面的帮助。首先,我一直在while循环中看到以下内容以读取文件:

wile(<filename>){
 next unless (/\w/);
 chomp;
 s/^\s*//;
 s/^\s*$//;
 my($name, $datatype, $io, $dummy) = split /\s*,\s*/, $_, 4;
}
wile(){
下一个,除非(/\w/);
咀嚼;
s/^\s*/;
s/^\s*$/;
我的($name,$datatype,$io,$dummy)=拆分/\s*,\s*/,$\u4;
}
所以,我想知道这是在做什么?因为正在读取的同一行中有逗号,所以逗号不会使它进入下一次迭代吗?那么,如果要在读取逗号时进行另一次迭代,它将如何分割行呢

另一个我被踩到的是:

while (<AP>) {
   chomp;
   s/
//g;
}
while(){
咀嚼;
/
//g;
}
我不知道那个代码到底在替代什么

谢谢

第一个片段:

  • 从名为
    filename
    的文件句柄中读取一行。对于文件句柄来说,这是一个非常糟糕的名称
  • 如果行中甚至没有一个
    \w
    (单词字符),它将跳过处理。
    除非(/\w/),否则下一个是
    ,则代码>与下一个相同。注意,除非/\w/,否则不需要括号--
    next很好。
    单词字符是,来自

    \w
    匹配单词字符(字母数字或
    ),不仅匹配
    [0-9a-zA-Z]
    ,还匹配来自非罗马脚本的数字和字符

  • 它(仅)删除带有
    chomp
    的换行符。然后删除前导空格(如果有)

  • 它会删除空行,即只有空格的空行
  • 它用逗号分隔行,允许它们在前后有空格。它还将返回的术语数量限制为
    4
    。这意味着它返回前三个逗号分隔的字段,然后在列表的最后一个元素中返回所有其他字段作为一个字符串
  • 第二个片段真的很糟糕,不管它打算做什么。(删除线上的空格?)


    评论

    使用词法文件句柄比使用裸名称要好得多。所以你要打开一个文件作为

    open my $fh, '<', $filename or die "Can't open $filename: $!";
    
    使用
    \w
    也会跳过包含某些字符的行(与
    \w
    匹配的字符除外),这意味着最好确保可以跳过这些字符

    这里可能意味着跳过带有逗号但没有
    \w
    (逗号与
    \w
    不匹配)的行,该行将在列表中返回空格(或空字符串)。我觉得这有点隐蔽和脆弱。我只会删除带有空格的行,并在处理过程中处理可能出现的松散逗号。就目前情况而言,它对
    、a、
    没有帮助,不管怎样,产生
    (“”、'a')
    。因此,在任何情况下都可能需要进行检查


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

    对于第一个代码段,我有一个问题是关于下一部分,除非。。。你的回答对我帮助很大。我以为只要读到一个非字母数字字符,它就会读到下一行。第二个,我也同意这是一个糟糕的代码,文件中有空格和新行,但是chomp会处理新行,我看到他们在其他地方用s/\s*//g替换空格,这就是为什么这会让我感到沉重。
    除非(条件)
    =
    如果(!条件)
    @raina77ow,那么这两行就是这么做的?因为他们在这个脚本的其他地方都使用
    s/\s*$/
    。@sikquiver我更新了答案。如果有更多内容需要添加/编辑,请告知我。我不知道你到底在想什么,谢谢你澄清。然而,代码的其余部分也需要注释。@sikquiver同意——第二个代码片段不应该在那里。我也不知道这意味着什么。至于剥离空间,这是一种常见的方法,通常比将它们合并在一行中要快一些(您也可以看到)。
    next unless /\S/;  # or
    next if /^\s*$/;