in reply to Reading into array with sscanf

#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11160631 use warnings; my $save_fn = 'save.fn'; # NOTE my @c_speed = (5, 8, 12, 8); my $sfh; open($sfh, '>', $save_fn) or die "Unable to open file $save_fn : $!"; print $sfh "@c_speed\n"; close $sfh; # NOTE #... # #The file contains a line that looks like "5 8 12 8\n" #... my $load_fn = 'save.fn'; # NOTE my $lfh; open($lfh, '<', $load_fn) or die "Unable to open file $load_fn : $!"; #$rstring = <$lfh>; # Char speeds # ($c_speed[0], $c_speed[1], $c_speed[2], $c_speed[3]) = sscanf("%d % +d %d %d", $rstring); # NOTE using ' ' instead of / / also removes the \n @c_speed = map $_ + 0, split ' ', <$lfh>; # NOTE force number use Data::Dump 'dd'; dd @c_speed;

Outputs:

(5, 8, 12, 8)

Replies are listed 'Best First'.
Re^2: Reading into array with sscanf
by colintu (Acolyte) on Jul 16, 2024 at 16:11 UTC

    Thanks for all the replies. The examples all work and I even understand them (after a bit of reading). However, I'm seeing some weirdness in my actual application. The c_speed variable is being used in a Tk widget as follows:

    my $cs_e1 = $seg1_f->Entry(-textvariable => \$c_speed[0], -width => +4, -validate => 'all', -vcmd => \&validate_s +peed, -font => $med_font)->g +rid( -row => 0, -column => +1, -sticky => "w"); sub validate_speed{ my $val = shift; $val ||= 0; #get alphas and punctuation out if( $val !~ /^\d+$/ ){ return 0 } if (($val >= 0) and ($val <= 10)) {return 1} else{ return 0 } }

    When I use split I can print c_speed to the terminal and the values are there, the same as when I use my sscanf lines

    $rstring = <$lfh>; ($c_speed[0], $c_speed[1], $c_speed[2], $c_speed[3]) = sscanf("%d %d + %d %d", $rstring);

    BUT, the Tk Entry widget only sees the new values when using sscanf. When I use split the variable still retains it's old value. I'm assuming this is some widget weirdness - can anyone explain please?

      Can you show some of the values that do not update?

        As shown in the example I just posted the variable $c_speed[0] in the Entry widget doesn't update when the "split" version of load file routine runs, but it *does* update when the sscanf version runs. The entry box itself works. The whole application is 500 lines so I don't want to post that here.