我是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地址最终组合成一个变量,并以(,)逗号分隔。
答案 0 :(得分:3)
ApplicationDbContext _Db = new ApplicationDbContext();
将一次性读取完整的文件数据。如果文件大小很大,这可能会导致问题。让我向您展示一个解决此问题的简单方法。
File::Slurp
检查行号并将行数据分配给相应的变量$.
注意:如果必须更改行数据,则在将行数据分配给变量之前,请在相应的条件块中使用搜索和替换。
代码:
join
答案 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删除换行符。