Perl Array Output Not Consistant

时间:2015-08-07 01:44:30

标签: linux perl

So I'm writing this Perl script to list the contents of a folder and grepping a specific file. When I run my script, files with single digit dates don't work correctly.

foreach $device (@devices){
   $ls = `ls -l /mypath/to/$device | grep '.confg'`;
        @lsOut = split / /, $ls;
        if (@lsOut){
                print $lsOut[5] . ' ' . $lsOut[6] . ' ' . $lsOut[7];
        }

}

Here is the current output

Jul 29 09:35
Jul 29 09:47
Aug  6
Aug  6
Jul 29 07:32
Jul 29 09:51
Jul 29 09:25
Aug  6
Aug  6

Those Aug 6th dates should also have the time stamp on them.

1 个答案:

答案 0 :(得分:1)

查看split上的联机帮助页。你正在分裂一个空间 - 你正在做的一个常见问题是如果Aug 6中的文本是对齐的,它将有两个空格,因此你会得到一个不受欢迎的'null'字段。

split会根据您指定“空间”的方式做一些微妙的不同。 E.g。

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

my $example_str = "    some text   here Aug  6 Jul 27";

my @stuff = split ( / /, $example_str );
print Dumper \@stuff; 

my @stuff2 = split ( /\s+/, $example_str );
print Dumper \@stuff2; 

my @stuff3 = split ( ' ', $example_str );
print Dumper \@stuff3; 

这给出了:

$VAR1 = [
          '',
          '',
          '',
          '',
          'some',
          'text',
          '',
          '',
          'here',
          'Aug',
          '',
          '6',
          'Jul',
          '27'
        ];
$VAR1 = [
          '',
          'some',
          'text',
          'here',
          'Aug',
          '6',
          'Jul',
          '27'
        ];
$VAR1 = [
          'some',
          'text',
          'here',
          'Aug',
          '6',
          'Jul',
          '27'
        ];

/ /上分割会为您提供更多字段,但是有一堆零长度字符串。在/\s+/上拆分几乎可以提供你想要的东西,但请注意 - 它将“行首”视为一个字段(所以你得到一个空字符)。并且' '从第一个字符开始为您提供空白分隔。这一般你想要的东西,这就是为什么你只是split;

的默认值