как распечатать вызываемую подпрограмму внутри подпрограммы

У меня есть этот perl-скрипт, который работает хорошо, вывод представлен в консоли. Тем не менее, моя идея состоит в том, чтобы перенаправить в файл.... пока я смог выполнить половину задачи. Я могу НАПЕЧАТАТЬ ФАЙЛ все, кроме двух подпрограмм, которые вызываются в "sub writepage"

Любые идеи?

#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw/strftime/;
#use warnings;
my $TOTALIOS = 'totalios';
my $READP = 'readpe';
my $CACHEP = 'cachehit';
my $CKBSEC = 'currentkb';
my $MKBSEC = 'maximumkb';
my $CIOSEC = 'currentio';
my $MIOSEC = 'maxio';
my $DATESTORE = 'dates.sec';
my $DATECMD = strftime "%m/%d/%y", localtime;
my $TIOS = 'Tios';
my $READp = 'readp';
my $CACHEp = 'cachep';
my $CKBsec = 'ckbsec';
my $MKBsec = 'mkbsec';
my $CIOsec = 'ciosec';
my $MIOsec = 'miosec';
my ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR) = &mysubinput;
#my $STORENUM;
#my $STORENAME;
#my $IMGPREFIX;
#my $MONTH;
#my $DAY;
#my $YEAR;
my $outfile = 'datastore.txt';
sub mysubinput
{
    print "Enter the number for the datastore: \n";
        my $STORENUM = <STDIN>;
        chomp($STORENUM);
        print "Enter the name for the datastore e.g: DataStore or ServerStore: \n";
        my $STORENAME = <STDIN>;
        chomp($STORENAME);
        print "Enter the data store image prefix e.g. datastore or serverstore: \n";
        my $IMGPREFIX = <STDIN>;
        chomp($IMGPREFIX);
        print "Enter the month MM: \n";
        my $MONTH = <STDIN>;
        chomp($MONTH);
        print "Enter the day DD: \n";
        my $DAY = <STDIN>;
        chomp($DAY);
        print "Enter the Year YYYY: \n";
        my $YEAR = <STDIN>;
        chomp($YEAR);
    return ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR);
#   print "$STORENUM $STORENAME $IMGPREFIX $MONTH $DAY $YEAR\n";
#   print "Not a very interesting routine\n";
#   print "This does the same thing every time\n";
#   print "$TOTALIOS\n";
#   print "Enter the number for the datastore: \n";
#   $line = <STDIN>;
#   chomp($line);
#   print "$line\n";
#   print "$DATECMD\n";
}
sub writedate 
{
    print "! $DATECMD\n";   
}    

sub writesections
{
    print "| [[File:$STORENAME-$STORENUM-$TIOS-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$READp-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$CACHEp-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$CKBsec-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$MKBsec-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$CIOsec-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$MIOsec-$MONTH-$DAY-$YEAR.png| 100px]]\n";
}   

sub writepage
{
    open (FILE, ">> $outfile") || die "problem opening $outfile\n";
    print FILE "Go back to [[MD3000i-Perf]] \n";
    print FILE "{| border=1 cellspacing=5 cellpadding=2 style=text-align: center \n";
    print FILE "|-\n";
    print FILE "! [[DataStore-1]]\n";
    print FILE "! [[DataStore-2]]\n";
    print FILE "! [[DataStore-3]]\n";
    print FILE "! [[DataStore-4]]\n";
    print FILE "! [[DataStore-5]]\n";
    print FILE "! [[DataStore-6]]\n";
    print FILE "! [[DataStore-7]]\n";
    print FILE "! [[DataStore-8]]\n";
    print FILE "! [[DataStore-9]]\n";
    print FILE "|-\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "| [[File:disk.png |60px]]\n";
    print FILE "|}\n";
    print FILE "{| border=1 cellspacing=5 cellpadding=2 style=text-align: center\n";
    print FILE "|-\n";
    print FILE writedate();
    print FILE "|-\n";
    print FILE writesections();
    print FILE "|-}\n";
    close(FILE);
}

#open (FILE, "> $myfile") || die "Couldn't open $myfile: $!\n";
#print FILE writepage();
#close (FILE);

writepage();

person user1814718    schedule 05.12.2012    source источник
comment
Такой код меня огорчает. Основная часть writepage сводится к print FILE map "! [[DataStore-$_]]\n", 1..9; и print FILE "| [[File:disk.png |60px]]\n" x 9;. mysubinput может извлечь выгоду из метода prompt с sub prompt(@){print @_, "\n"; chomp(my $ans=<STDIN>); $ans}, затем $STORENUM = prompt "Enter the number for the datastore:";   -  person amon    schedule 05.12.2012
comment
эй, я не программист и не знаю Perl, это мой первый опыт в изучении, но спасибо за ваш вклад1   -  person user1814718    schedule 07.12.2012


Ответы (3)


Вы должны использовать лексические дескрипторы файлов. Это сделает эту задачу тривиальной. Это также предпочтительный способ обработки дескрипторов файлов в целом. Вот пример:

sub mysub {
    open my $fh, '>>', $outfile or die "Problem opening $outfile\n";
    print $fh "Some string\n";
    anotherSub($fh);
    close $fh;
}

sub anotherSub {
    my $fh = shift;
    print $fh "A second string\n";
}
person Jonah Bishop    schedule 05.12.2012

Используйте выбрать.

Или вернуть строку из функций вместо печати?

person ysth    schedule 05.12.2012

я просто заменил FILE на лексические дескрипторы файлов:

sub writedate 
{
    my $fh = shift;
    print $fh "! $DATECMD\n";   
}    

sub writesections
{
    my $fh = shift;
    print $fh "| [[File:$STORENAME-$STORENUM-$TIOS-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print $fh "| [[File:$STORENAME-$STORENUM-$READp-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    [....]
}



  sub writepage
{
#   open (FILE, ">> $outfile") || die "problem opening $outfile\n";
    open my $fh, '>', $outfile or die "Problem opening $outfile\n";
    print $fh "Go back to [[MD3000i-Perf]] \n";
    print $fh "{| border=1 cellspacing=5 cellpadding=2 style=text-align: center \n";
    print $fh "|-\n";
    [....]
    [....]
    print $fh "|}\n";
    print $fh "{| border=1 cellspacing=5 cellpadding=2 style=text-align: center\n";
    print $fh "|-\n";
    writedate($fh);
    print $fh "|-\n";
    writesections($fh);
    print $fh "|-}\n";
#   close(FILE);
    close $fh;
}
person user1814718    schedule 05.12.2012