开发者

perl - help removing unwanted characters within split

开发者 https://www.devze.com 2023-03-09 22:47 出处:网络
I\'ve got a simple perl script that I need help tweaking. I was using split to separate the key and value. I almost got what I want but I want to remove the surrounding parentheses found in the input

I've got a simple perl script that I need help tweaking. I was using split to separate the key and value. I almost got what I want but I want to remove the surrounding parentheses found in the input file. Also, could is there a way to sort (make it a开发者_JS百科n option) on the number values? Thanks for your help.

Ex. Input file

(hlu,1)
(kcq,4)
(ob2,1)

Perl script:

#!/usr/bin/perl
my $str = '';

open FILE;
while (<>) {
    chomp;
    my ($k, $v) = split /,/;
    $str .= "$k:$v\n"
}
close FILE;
print "$str";

Results:

(hlu:1)
(kcq:4)
(ob2:1)

Want to see:

hlu:1
ob2:1
kcq:4


This is almost identical to Ivan's answer, except I used a single m// instead of split() -- reads simpler IMO

Also, not sure why you have open FILE / close FILE if you're using while(<>)... I got rid of 'em.

#!/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";
}


Change your loop to:

while (my $line = <FILE>) {
    chomp $line;
    $line =~ s/[()]//g;
    my ($k, $v) = split /,/, $line;
    $str .= "$k:$v\n"
}


You can remove all () symbols as mentioned by CanSpice. Or just remove starting/ending brackets:

$line =~ s/^\(|\)$//g; ## escaping () symbols with \

To sort your data you'll need to put it in array first, then sort array:

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";
}


Just for fun:

print "$_\n" for                  # 5
    map join(':', @$_),           # 4
    sort { $a->[1] <=> $b->[1] }  # 3
    map [ /(\w+),(\d+)/ ],        # 2
    <>                            # 1
;

You can interpret such pipelines in reverse order:

  1. Read the input lines.
  2. Use a regex to capture the items we care about. Package those items ($1 and $2) in an array ref.
  3. Sort those array refs numerically using element [1].
  4. Convert the little arrays to colon-separated strings.
  5. Print 'em.
0

精彩评论

暂无评论...
验证码 换一张
取 消