我有一个简单的perl脚本,我需要帮助调整。我使用split来分离键和值。我几乎得到了我想要的但我想删除输入文件中找到的周围括号。另外,有没有办法对数字值进行排序(使其成为选项)?谢谢你的帮助。
实施例。输入文件
(hlu,1)
(kcq,4)
(ob2,1)
Perl脚本:
#!/usr/bin/perl
my $str = '';
open FILE;
while (<>) {
chomp;
my ($k, $v) = split /,/;
$str .= "$k:$v\n"
}
close FILE;
print "$str";
结果:
(hlu:1)
(kcq:4)
(ob2:1)
想看:
hlu:1
ob2:1
kcq:4
答案 0 :(得分:5)
这几乎与Ivan's answer完全相同,只是我使用了一个m//
而不是split()
- 读取更简单的IMO
此外,如果您使用while(<>)
,我不知道为什么您有open FILE
/ close FILE
...我摆脱了他们。
#!/usr/bin/perl
my @items = ();
# read input from stdin/@ARGV
while (<>) {
chomp;
m/\((.*),(.*)\)/;
push @items, [$1, $2];
}
# sort
@items = sort { $a->[1] <=> $b->[1] } @items;
foreach(@items)
{
my ($k, $v) = @$_;
print "$k:$v\n";
}
答案 1 :(得分:4)
将您的循环更改为:
while (my $line = <FILE>) {
chomp $line;
$line =~ s/[()]//g;
my ($k, $v) = split /,/, $line;
$str .= "$k:$v\n"
}
答案 2 :(得分:2)
您可以删除CanSpice所述的所有()
符号。或者只删除开始/结束括号:
$line =~ s/^\(|\)$//g; ## escaping () symbols with \
要对数据进行排序,首先需要将其放入数组,然后排序数组:
my @data_lines;
while (<>) {
chomp;
s/^\(|\)$//g;
push(@data_lines, [ split /,/ ]); ## save columns in array
}
## sort data numerically by second column
@data_lines = sort {$a->[1] <=> $b->[1]} @data_lines;
## output result
for my $row (@data_lines) {
my ($k, $v) = @$row; ## put values into variables for convenience
print "$k:$v\n";
}
答案 3 :(得分:2)
只是为了好玩:
print "$_\n" for # 5
map join(':', @$_), # 4
sort { $a->[1] <=> $b->[1] } # 3
map [ /(\w+),(\d+)/ ], # 2
<> # 1
;
您可以按相反顺序解释此类管道:
$1
和$2
)打包到数组引用[1]
以数字方式对这些数组引用进行排序。