Avatar of PMG76
PMG76
Flag for United States of America asked on

How to seperate and print integers in PERL

I need some help with an assignment.  I need to input a 5 digit integer and then print the 5 numbers to the screen with a space between them.  i need some help getting this set up.  i can't use arrays or the split function.
Math / SciencePerl

Avatar of undefined
Last Comment
ozo

8/22/2022 - Mon
clockwatcher

We can't do your homework for you.  Do you have anything started?  Take a look at the substr function:  

  perldoc -f substr
PMG76

ASKER
I'm not asking anyone to do it.  i clearly stated that it was homework.  From what i gather I need to use the chop and chomp functions but I'm unsure on how to start it.,
ozo

can you use the join and unpack functions?
Experts Exchange has (a) saved my job multiple times, (b) saved me hours, days, and even weeks of work, and often (c) makes me look like a superhero! This place is MAGIC!
Walt Forbes
jeromee

perl -e '$_=$ARGV[0]; while( /(\d)(\d*)/ ){ print "$1 "; $_=$2 }' 12345
1 2 3 4 5

ozo

Do you know how to find documentation on the chop function?
perldoc -f chop
       chop VARIABLE
       chop( LIST )
       chop    Chops off the last character of a string and returns the
               character chopped.  It is much more efficient than "s/.$//s"
               because it neither scans nor copies the string.  If VARIABLE is
               omitted, chops $_.  If VARIABLE is a hash, it chops the hash's
               values, but not its keys.

               You can actually chop anything that's an lvalue, including an
               assignment.

               If you chop a list, each element is chopped.  Only the value of
               the last "chop" is returned.

               Note that "chop" returns the last character.  To return all but
               the last character, use "substr($string, 0, -1)".


You can do a loop printing from the end of the string
jeromee

if you don't want the trailing space:
perl -e '$_=$ARGV[0]; while( /(\d)(\d*)/ ){ print "$1";  print " " if $2; $_=$2 }' 12345
1 2 3 4 5
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
ozo

print "$1 " while s/(\d)//
#or
print join" ",/\d/g
PMG76

ASKER
I can't use arrays
ozo

does that mean you can't use @ARGV to get arguments from the command line?
does that mean you can't use lists?
Your help has saved me hundreds of hours of internet surfing.
fblack61
PMG76

ASKER
This is where I am right now but it's clearly not working.


use warnings;
use strict;
print "\n";
print 'Enter a five digit number: ' ;
my $num = <>;
##chop $num;
##my $saveme = chop $num;
##print "$num   ";
##perl -e '$_=$ARGV[0]; while( /(\d)(\d*)/ ){ print "$1";  print "   " if $2; $_=$2 }' $num;
print join"    ",/\d/g;
ozo

> I can't use arrays
do you need help to overcome a difficulty you are having with using arrays?
ozo

the shift function can get a value from @ARGV without explicitly naming it,
but it still uses it implicitly.
<> also uses @ARGV implicitly.
You might avoid that by using <STDIN> instead
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
ozo

// by default operates on $_
you can either do
$num =~ /\d/g
or
$_ = <>;
(unless you are trying to avoid using @ARGV)
vikaskhoria

try this code, simply replace each digit with the digit + a space!


use warnings;
use strict;
print "\n";
print 'Enter a five digit number: ' ;
my $num = <>;

$num ~= s/\d/$1 /g;
print $num;


### Or you can also do this:
$num ~= s/\d/$1 /g;
$num ~= s/ $//;  ## To remove the last space added in previous line
or
chomp($num); ## To remove the last space added in previous line

print $num;

Open in new window

ASKER CERTIFIED SOLUTION
ozo

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
ozo

you probably meant
$num =~ s/(\d)/$1 /g;
and
chop($num)

more simply
perl -pe "s// /g"
or to avoid extra space at the end
perl -pe "s/\B/ /g"
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
PMG76

ASKER
Ok.  i got it to print the numbers seperately now but i need them to print with 3 spaces between each number.  How do i accompkish this:

#!/usr/bin/perl
use warnings;
use strict;
print "\n";
print 'Enter a five digit number: ' ;
my $num = <>;

$num =~ s/(\d)/$1 /g;
chop($num);

print "$num   \n";

SOLUTION
jeromee

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
vikaskhoria

Yeah I am sorry about the chomp - its a chop.
Thanks OZO

PMG76 :

3 instead of one is simple, right??

Just replace one space with 3!! :)
Like this:

$num =~ s/(\d)/$1   /g;

or you can also do this, I guess:
$num =~ s/(\d)/$1 {3}/g;

ozo

s/(\d)/$1 {3}/g;
does not work
you could do
s/(\d)/$1." "x3/eg;
or
s/(\d)/$1@{[" "x3]}/g;
but it seems like a silly way to do it.


$num =~ s/(\d)/$1   /g;    #<<<< add 3 spaces here
chop($num);
leaves two spaces at the end if $num originally ended with a digit,
or if it originally ended with  non-digit, it would remove that character.
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
ozo

#!/usr/bin/perl
use warnings;
use strict;
#another way
$/=\1;
$\=" "x3;
print while <>;