使用Perl

时间:2017-02-03 14:04:36

标签: perl

我是Perl的新手,所以请放弃我的无知。我要做的是读取一个文件(已经使用File :: Slurp模块)并从文件中的数据创建变量。目前我有这个设置:

use File::Slurp;
my @targets = read_file("targetfile.txt");
print @targets;

在该目标文件中,我有以下数据位:

  

id:123456789

     

名称:anytownusa

     

1.2.3.4/32

     

5.6.7.8/32

第一行是ID,第二行是名称,所有连续行都是IP地址(最大长度为几百)。

所以我的目标是读取该文件并创建看起来像这样的变量:

$var1="123456789";

$var2="anytownusa";

$var3="1.2.3.4/32,5.6.7.8/32,etc,etc,etc,etc,etc";

**请注意,所有IP地址最终组合成一个变量,并以(,)逗号分隔。

3 个答案:

答案 0 :(得分:3)

ApplicationDbContext _Db = new ApplicationDbContext(); 将一次性读取完整的文件数据。如果文件大小很大,这可能会导致问题。让我向您展示一个解决此问题的简单方法。

  1. 使用while循环
  2. 逐行读取文件
  3. 使用File::Slurp检查行号并将行数据分配给相应的变量
  4. 将ips存储在数组中,最后使用$.
  5. 打印它们

    注意:如果必须更改行数据,则在将行数据分配给变量之前,请在相应的条件块中使用搜索和替换。

    代码:

    join

    Demo

答案 1 :(得分:1)

直接将文件读入变量:

use Modern::Perl;

my ($id, $name, @ips) = (<DATA>,<DATA>,<DATA>);
chomp ($id, $name, @ips);
say $id;
say $name;
$" = ',';
say "@ips";

__DATA__
id: 123456789
name: anytownusa
1.2.3.4/32
5.6.7.8/32

<强>输出:

id: 123456789
name: anytownusa
1.2.3.4/32,5.6.7.8/32

答案 2 :(得分:1)

正如已经指出的那样,没有理由&#34; slurp &#34;将整个文件转换为变量。如果没有别的,它只会使处理更难。 另外,为什么不在散列中存储命名标签,在本例中为

my %identity = (id => 123456789, name => 'anytownusa');

下面的代码从文件中选取密钥名称,它们不是硬编码的。

然后

use warnings;
use strict;
use feature 'say';

my (@ips, %identity);

my $file = 'targetfile.txt';
open my $fh, '<', $file or die "Can't open $file: $!";

while (<$fh>) 
{
    next if not /\S/;
    chomp;

    my ($m1, $m2) = split /:/;                #/(stop bad syntax highlight)

    if ($m1 and $m2) { $identity{$m1} = $m2; }
    else             { push @ips, $m1;       }
}

say "$_: $identity{$_}" for keys %identity;

say join '/', @ips;

如果该行没有:,则split将整个返回,这将是ip,并存储在数组中以便稍后处理。否则,它会返回'id''name'的命名对。

我们首先使用next if not /\S/;跳过空白行,因此该行必须包含一些非空格元素且else足够,因为$m1中始终存在某些内容。我们还需要使用chomp删除换行符。