如何在Perl中跳过非空格或数字的行?

Omn*_*ent 1 arrays string perl

我正在从这样的文件中读取数据

while (<$fh>)
{
        @tmp = split; # <-- ?
        push @AoA, [@tmp];
}
Run Code Online (Sandbox Code Playgroud)

我有几个问题.标记线有什么作用?它是否按行分割文件并将每行的元素存储到数组中?如果是这样,是否可以将@tmp转换为字符串或在@tmp上执行正则表达式?

基本上我想停止将数据推送到AoA上,如果我在文件中找到除空格或整数之外的任何内容.我已经有了正则表达式:\ ^ [\ s\d]*$ \

Nat*_*man 8

[ @tmp = split;]是简写:

@tmp = split " ", $_, 0;
Run Code Online (Sandbox Code Playgroud)

这类似于

@tmp = split /\s+/, $_, 0;
Run Code Online (Sandbox Code Playgroud)

但忽略任何前导空格,所以" foo bar baz"变成("foo", "bar", "baz")而不是("", "foo", "bar", "baz").

$fh使用文件处理程序中的每一行并将其拆分,使用空格作为分隔符.

关于你想做什么,为什么不$_开始运行正则表达式?那是一个字符串.

你可以这样做:

while (<$fh>) {
    last unless  /^[\s\d]*$/; # break if a line containing something 
                              # other than whitespace or a number is found
    @tmp = split;
    push @AoA, [@tmp];
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,如果你对Perl扩展这样的快捷方式感到好奇,你可以使用B :: Deparse模块:perl -MO = Deparse -lne'print +(split)[0]' (2认同)

bri*_*foy 5

当您想知道Perl内置的功能时,请阅读其文档.您获得的大部分答案仅仅是重述文档.使用任何语言的关键是学习如何使用其文档.如果您已经阅读了文档并且不明白,请在您的问题中提及:)

  • 您可以在perlfunc页面中查看所有内置函数.

  • 在命令行中,您可以使用-f开关来perldoc只提取内置文档: perldoc -f split

祝好运, :)