我正在阅读此代码中的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;
}
我不知道那个代码实际上代替了什么...
谢谢!
答案 0 :(得分:1)
第一个片段:
filename
的文件句柄中读取一行。对于文件句柄来说,这是一个非常糟糕的名称如果该行上没有单个\w
(字符),则会跳过处理。
next unless (/\w/);
与next if not (/\w/)
相同。请注意,不需要括号 - next unless /\w/;
没问题
字符来自perlretut
\w
匹配单词字符(字母数字或_
),不仅仅是[0-9a-zA-Z_]
,还有非罗马字母的数字和字符
它会删除(仅)带有chomp
的换行符。然后它删除前导空格,如果有的话
4
。这意味着它返回前三个以逗号分隔的字段,然后将所有其余字段作为列表最后一个元素中的一个字符串第二个片段非常糟糕,无论它的意图是什么。 (删除行上的空格?)
评论
使用词法文件句柄,而不是使用裸名称要好得多。所以你打开一个文件
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
时,它会保留所有空格,否则它们不会被删除。