【问题标题】:Perl and Foreach loop with Splitting带有拆分的 Perl 和 Foreach 循环
【发布时间】:2016-04-11 10:45:14
【问题描述】:

我有一个关于 Foreach 循环和使用 Perl 拆分的问题。

我想循环数组并将其拆分为名称和值。

1.) 我读取文件并保存到字符串。

2.) 我拆分空行并保存到一个数组中。

我的脚本:

#!/usr/bin/perl

use strict;

my $pathconfigfile = 'config.conf';
my @configline;

open(my $configfile, "<", $pathconfigfile);

local $/;
my @configdata  = split("\n\n",<$configfile>);

#print $configdata[0], "\n";
#print $configdata[1], "\n";
#print $configdata[2], "\n";

foreach my $data (@configdata){
        my @editing = split /#/, $data;
        my ($name, $value) = @editing[0,1];
        print $name "\n";
        print $value "\n";
}

close $configfile;

配置文件:

Testingtttttttttttttttttttttttt
############################################
0987654345678909876MN09uz6t56789oiuhgölkjhgfr
0987654323456789098765fgnloiuztlkjhgfrtzuiknb

MegaMixoiuzt
############################################
09876543457890098765NSUDlkjhzgtfr67899ztz9098
098765435678987t87656789876567898765679097658

TESTINGPARTS
############################################
0987654567890098765hzzasza654567uhgdjdjfacdaa
9876545678987654mchfuiaq754567898765434567876

我的愿望结果:

$name = 测试tttttttttttttttttttttttt

$value = 0987654345678909876MN09uz6t56789oiuhgölkjhgfr 0987654323456789098765fgnloiuztlkjhgfrtzuiknb

$name = MegaMixoiuzt

$value = 09876543457890098765NSUDlkjhzgtfr67899ztz9098 098765435678987t8765678987656789876567909765

$name = TESTINGPARTS

$value = 0987654567890098765hzzasza654567uhgdjdjfacdaa 9876545678987654mchfuiaq754567898765434567876

【问题讨论】:

  • 我认为没有理由不接受这些答案之一,每个答案都能解决您的问题

标签: arrays perl split


【解决方案1】:
 split /#/          # A "#" separates the two.

应该是

 split /\n#+\n/     # A line of "#" separates the two.

其他改进:

#!/usr/bin/perl

use strict;
use warnings;

my $config_qfn = 'config.conf';

open(my $config_fh, "<", $config_qfn )
    or die("Can't open \"$config_qfn\": $!\n");

local $/ = "";  # Paragraph mode
while (my $rec = <$config_fh>) {
    my ($name, $value) = split(/\n#+\n/, $rec);
    print "\$name = $name\n";
    print "\$value = $value\n";
}

【讨论】:

  • 也许$data 不应该在那里
【解决方案2】:

在没有 foreach 的情况下也是这样的:

use strict;
use warnings;

open my $fh, '<config.conf' or die "$!"; my $data = join '', <$fh>; close $fh;
my %hash = $data =~ /^(.+)\n#+\n(\S+\n\S+)/mg;
print "NAME: $_\nVALUE: $hash{$_}\n\n" for keys %hash

【讨论】:

  • 注意:这假定该值不包含任何空白字符。它还假设名称正好是一行长,并且值总是正好是两行长。
  • 谢谢!如有必要,$_ =~ s/\n// for keys %hash 会提供帮助吗?还是我听不懂你?
  • 我不是说有问题。我只是列出你所做的假设。它们可能是非常好的假设。由 OP 决定。 (也就是说,我认为该值不会总是两行长。)该行不会影响我列出的假设。
【解决方案3】:

你想被多个#分割,所以使用#+

+ 匹配一次或多次。

试试看

#!/usr/bin/perl

use strict;

my $pathconfigfile = 'config.conf';
my @configline;

open(my $configfile, "<", $pathconfigfile);

local $/;
my @configdata  = split("\n\n",<$configfile>);


foreach my $data (@configdata){
    my ($name,$value) = split /\n#+\n/, $data;
    print "$name $value\n\n";
}

【讨论】:

  • @ikegami 感谢您使用完整评论。我通过拆分删除了尾随和前导换行符。然后我将@value 更改为$value。 :)
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2017-03-13
  • 2013-08-31
  • 2015-06-16
  • 1970-01-01
  • 2011-10-20
  • 2013-10-04
相关资源
最近更新 更多