in reply to adding ";" to void elements

steph_bow,
The naive way to do this might look like:
#!/usr/bin/perl use strict; use warnings; while (<DATA>) { chomp; my @col = split /;/; push @col, '' for @col .. 2; print join ';', @col; print "\n"; } __DATA__ a;3 b;2;3 c;5;4 d;6
A less naive solution would use a module from CPAN such as Text::CSV or Text::xSV. To understand why that is a better approach, take a few minutes with Super Search.

Update: As noted by tye in the CB, this solution was originally not tested. I added chomp and changed @col .. 3; to @col .. 2;

Cheers - L~R

Replies are listed 'Best First'.
Re^2: adding ";" to void elements
by lodin (Hermit) on Feb 13, 2008 at 00:50 UTC

    You get a similar solution using a very useful idiom if you replace

    my @col = split /;/; push @col, '' for @col .. 2; print join ';', @col;
    with
    my $len = 3; print join ';', (split(/;/), ('') x $len)[0 .. $len-1];
    assuming that there are at most two semi-colons in the string. The focus here is the way to create the default trailing elements. This is quite useful when you create hashes, where it's imperative to not have any missing (or extra) elements. For instance:
    my %foo = map { (split /:/, $_, 2)[0, 1] } # Implicit "default" undef. qw/ foo:bar baz zip:zap:zoom / ; use Data::Dumper; print Dumper(\%foo); __END__ $VAR1 = { 'baz' => undef, 'foo' => 'bar', 'zip' => 'zap:zoom' };
    A naive
    my %foo = map { split /:/ } ...;
    would've been disastrous.

    lodin