perl - 帮助删除拆分中不需要的字符

时间:2011-06-02 23:28:23

标签: perl

我有一个简单的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

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$2)打包到数组引用
  3. 使用元素[1]以数字方式对这些数组引用进行排序。
  4. 将小数组转换为以冒号分隔的字符串。
  5. 打印'em。