首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl脚本在子例程中调用子例程?

Perl脚本在子例程中调用子例程?
EN

Stack Overflow用户
提问于 2012-12-05 03:10:35
回答 2查看 311关注 0票数 0

您好,我创建了以下输出到wiki页面的脚本。问题是我不确定如何格式化我的输出。下面是我的代码:

代码语言:javascript
复制
    #!/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;
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(mysubinput())
{

    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
{
    &mysubinput;
    print "Go back to [[MD3000i-Perf]] \n";
    print "{| border=1 cellspacing=5 cellpadding=2 style=text-align: center \n";
    print "|-\n";
    print "! [[DataStore-1]]\n";
    print "! [[DataStore-2]]\n";
    print "! [[DataStore-3]]\n";
    print "! [[DataStore-4]]\n";
    print "! [[DataStore-5]]\n";
    print "! [[DataStore-6]]\n";
    print "! [[DataStore-7]]\n";
    print "! [[DataStore-8]]\n";
    print "! [[DataStore-9]]\n";
    print "|-\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "|}\n";
    print "{| border=1 cellspacing=5 cellpadding=2 style=text-align: center\n";
    print "|-\n";
    &writedate;
    print " |-\n";
    &writesections;
    print " |-}\n";
}
#&mysubinput;
&writepage;
#&mysubinput;
#&writesections;

使用这种方法,事情似乎是可行的。然而,我的输入并不是100%正确的。我必须输入我所有的数据两次,然后程序才能吐出一些东西...

代码语言:javascript
复制
Enter the number for the datastore:
1
Enter the name for the datastore e.g: DataStore or ServerStore:
DataStore
Enter the data store image prefix e.g. datastore or serverstore:
datastore
Enter the month MM:
12
Enter the day DD:
03
Enter the Year YYYY:
2012
Enter the number for the datastore:
1
Enter the name for the datastore e.g: DataStore or ServerStore:
DataStore
Enter the data store image prefix e.g. datastore or serverstore:
datastore
Enter the month MM:
12
Enter the day DD:
03
Enter the Year YYYY:
2012
Go back to [[MD3000i-Perf]]
{| border=1 cellspacing=5 cellpadding=2 style=text-align: center
|-
! [[DataStore-1]]
! [[DataStore-2]]
! [[DataStore-3]]
! [[DataStore-4]]
! [[DataStore-5]]
! [[DataStore-6]]
! [[DataStore-7]]
! [[DataStore-8]]
! [[DataStore-9]]
|-
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
|}
{| border=1 cellspacing=5 cellpadding=2 style=text-align: center
|-
! 12/04/12
        |-
| [[File:DataStore-1-Tios-12-03-2012.png| 100px]]
| [[File:DataStore-1-readp-12-03-2012.png| 100px]]
| [[File:DataStore-1-cachep-12-03-2012.png| 100px]]
| [[File:DataStore-1-ckbsec-12-03-2012.png| 100px]]
| [[File:DataStore-1-mkbsec-12-03-2012.png| 100px]]
| [[File:DataStore-1-ciosec-12-03-2012.png| 100px]]
| [[File:DataStore-1-miosec-12-03-2012.png| 100px]]
        |-}

将此变量添加到“my”后,现在似乎可以正常工作了。

代码语言:javascript
复制
my ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR) = &mysubinput;

第二部分是添加return ($STORENUM,$STORENAME,$IMGPREFIX,$MONTH,$DAY,$YEAR);

现在我的问题是,如何将子编写的输出放到一个文件中,比如datastore.wk?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-05 03:34:26

永远不要注释use strict行:)

它会警告您,您的writesections sub无权访问在mysubinput范围内声明的变量!

我建议你先了解一下private variables。要共享您的变量,您应该对它们进行return。遵循你的逻辑:

代码语言:javascript
复制
sub mysubinput
{
    ...
    return ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR);
}

my ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR) = mysubinput();
writesections($STORENAME, $STORENUM, $MONTH, $DAY, $YEAR);

但是,如果您希望扩展Perl脚本,迟早必须学习面向对象编程。那么,Moose framework就是你的朋友。

票数 1
EN

Stack Overflow用户

发布于 2012-12-05 03:31:40

如果您启用了use strictuse warnings,您将看到如下消息

代码语言:javascript
复制
Global symbol "$STORENAME" requires explicit package name

它们可以帮助你调试你的程序。

问题是,您在mysubinput中声明的变量是该子例程的本地变量,并且在子例程返回时将被丢弃。就writesections而言,这些变量从未声明过,程序也不会编译。

然后,它们将在整个文件的其余部分中都可以访问,您的程序应该可以工作。

顺便说一句,用&mysubinput调用子例程确实是一种非常古老的风格。您应该自始至终使用mysubinput()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13710181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档