字符串中具有不同字符的拆分函数的 Perl 使用
Perl usage of split function with varied characters in strings
我需要从中进行正则表达式的字符串如下:
colour -name red -value 8,0,2 -code 0
colour -name blue -value 9 -code 1
colour -name yellow -value 7,3,2.5 -code 1
所需的输出是颜色名称和值的散列
red 8,0,2 blue 9 yellow 7,3,2.5
一段代码:
#/usr/perl;
my %result = {};
my @word = split ' ', $line ; #$line has each of the line of data that is read from text
$result{$word[2]} = $word[4];
但这并没有为有逗号的值提供所需的输出。
TIA.
需要输出
ITEMS
red 8,0,2 blue 9 yellow 7,3,2.5
获得输出
ITEMS
red 8
0 2 blue 9
yellow 7 3
2.5
请参考下面的逻辑,我们逐行遍历每个句子并提取第2列和第4列的值。反过来我们构建哈希。
use Data::Dumper;
$line = 'colour -name red -value 8,0,2 -code 0
colour -name blue -value 9 -code 1
colour -name yellow -value 7,3,2.5 -code 1';
my %result = {};
for my $sentence (split '\n', $line) {
my @array = split ' ', $sentence;
my $color = $array[2];
my $value = $array[4];
$result{$color} = $value;
}
print Dumper(\%result);
结果
$VAR1 = {
'red' => '8,0,2',
'HASH(0x128ecb8)' => undef,
'blue' => '9',
'yellow' => '7,3,2.5'
};
虽然这是一个工作代码,但请将其作为参考,您可能需要做进一步的调整。我不是本地 Perl 程序员,请提供解决方案:)
看看这是否适合你。
由于在您的输入文件中,第 3 和第 5 个字段分别是颜色名称和颜色值,我们将这些内容存储到一个数组中。
push(@contents, $words[2]);
push(@contents, $words[4]);
之后我们将数组内容连接到标量变量以适应单元格。
my $string = join(' ', @contents);
脚本如下:
use strict;
use warnings;
use Data::Dumper;
use Text::CSV_XS qw( csv );
my (@words, @contents) = [];
while(<DATA>){
@words = split / /, $_;
push(@contents, $words[2]);
push(@contents, $words[4]);
}
my $string = join(' ', @contents);
print $string;
#Write content to CSV file
my $out_file = "out.csv";
open( my $fh, '>:encoding(UTF-8)', $out_file )
or die "Could not open file '$out_file'";
my $csv = Text::CSV_XS->new;
#Header
$csv->combine( "ITEMS" );
print $fh ($csv->string,"\n");
#print cell content
$csv->combine( $string );
print $fh ($csv->string,"\n");
close $fh;
__DATA__
colour -name red -value 8,0,2 -code 0
colour -name blue -value 9 -code 1
colour -name yellow -value 7,3,2.5 -code 1
您的代码未提供您声称的结果。我已将您的代码充实成我可以 运行 的内容(如果您自己这样做会对您有所帮助):
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my %result;
while (my $line = <DATA>) {
my @word = split ' ', $line ; #$line has each of the line of data that is read from text
$result{$word[2]} = $word[4];
}
say Dumper \%result;
__DATA__
colour -name red -value 8,0,2 -code 0
colour -name blue -value 9 -code 1
colour -name yellow -value 7,3,2.5 -code 1
我得到的输出是这样的:
$VAR1 = {
'blue' => '9',
'yellow' => '7,3,2.5',
'red' => '8,0,2'
};
看起来这就是你想要的散列。因此,如果您得到不同的结果,那么您需要解释我的代码与您在问题中省略的代码有何不同。
但我看不出在空格上拆分字符串会影响其中的逗号。
我需要从中进行正则表达式的字符串如下:
colour -name red -value 8,0,2 -code 0
colour -name blue -value 9 -code 1
colour -name yellow -value 7,3,2.5 -code 1
所需的输出是颜色名称和值的散列
red 8,0,2 blue 9 yellow 7,3,2.5
一段代码:
#/usr/perl;
my %result = {};
my @word = split ' ', $line ; #$line has each of the line of data that is read from text
$result{$word[2]} = $word[4];
但这并没有为有逗号的值提供所需的输出。 TIA.
需要输出
ITEMS
red 8,0,2 blue 9 yellow 7,3,2.5
获得输出
ITEMS
red 8
0 2 blue 9
yellow 7 3
2.5
请参考下面的逻辑,我们逐行遍历每个句子并提取第2列和第4列的值。反过来我们构建哈希。
use Data::Dumper;
$line = 'colour -name red -value 8,0,2 -code 0
colour -name blue -value 9 -code 1
colour -name yellow -value 7,3,2.5 -code 1';
my %result = {};
for my $sentence (split '\n', $line) {
my @array = split ' ', $sentence;
my $color = $array[2];
my $value = $array[4];
$result{$color} = $value;
}
print Dumper(\%result);
结果
$VAR1 = {
'red' => '8,0,2',
'HASH(0x128ecb8)' => undef,
'blue' => '9',
'yellow' => '7,3,2.5'
};
虽然这是一个工作代码,但请将其作为参考,您可能需要做进一步的调整。我不是本地 Perl 程序员,请提供解决方案:)
看看这是否适合你。
由于在您的输入文件中,第 3 和第 5 个字段分别是颜色名称和颜色值,我们将这些内容存储到一个数组中。
push(@contents, $words[2]);
push(@contents, $words[4]);
之后我们将数组内容连接到标量变量以适应单元格。
my $string = join(' ', @contents);
脚本如下:
use strict;
use warnings;
use Data::Dumper;
use Text::CSV_XS qw( csv );
my (@words, @contents) = [];
while(<DATA>){
@words = split / /, $_;
push(@contents, $words[2]);
push(@contents, $words[4]);
}
my $string = join(' ', @contents);
print $string;
#Write content to CSV file
my $out_file = "out.csv";
open( my $fh, '>:encoding(UTF-8)', $out_file )
or die "Could not open file '$out_file'";
my $csv = Text::CSV_XS->new;
#Header
$csv->combine( "ITEMS" );
print $fh ($csv->string,"\n");
#print cell content
$csv->combine( $string );
print $fh ($csv->string,"\n");
close $fh;
__DATA__
colour -name red -value 8,0,2 -code 0
colour -name blue -value 9 -code 1
colour -name yellow -value 7,3,2.5 -code 1
您的代码未提供您声称的结果。我已将您的代码充实成我可以 运行 的内容(如果您自己这样做会对您有所帮助):
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my %result;
while (my $line = <DATA>) {
my @word = split ' ', $line ; #$line has each of the line of data that is read from text
$result{$word[2]} = $word[4];
}
say Dumper \%result;
__DATA__
colour -name red -value 8,0,2 -code 0
colour -name blue -value 9 -code 1
colour -name yellow -value 7,3,2.5 -code 1
我得到的输出是这样的:
$VAR1 = {
'blue' => '9',
'yellow' => '7,3,2.5',
'red' => '8,0,2'
};
看起来这就是你想要的散列。因此,如果您得到不同的结果,那么您需要解释我的代码与您在问题中省略的代码有何不同。
但我看不出在空格上拆分字符串会影响其中的逗号。