1

我创建了以下子程序性别来随机打印字符串 MALE 或 FEMALE。当调用子程序时,打印命令在字符串末尾添加一个“1”后缀。请参阅下面的示例代码和输出:

sub gender { 
    if ( (int rand(100)) >50) {
        print "MALE  ";
    }
    else {
        print "FEMALE";
    }
}   

foreach (1..5) {
    print &gender, "\n"; 
} 

请注意,“1”后缀为“MALE”或“FEMALE”

输出:

FEMALE1
FEMALE1
MALE  1
MALE  1
FEMALE1
MALE  1

我正在使用perl v5.8.9 v5.8.9为 MSWin32-x86-multi-thread 构建

Binary build 826 [290470] provided by ActiveState http://www.ActiveState.com Built May 24 2009 09:21:05

4

4 回答 4

14
print &gender

调用性别函数并打印它返回的内容。性别本身,作为它在任一分支中所做的最后一件事,打印一个字符串。隐式地,它返回其中最后一个表达式的结果(print "MALE" 或 print "FEMALE"),并且 print 成功时返回 1。

所以要么这样做:

sub gender { if ( rand(100) >= 50 ) {print "MALE  ";}  else {print "FEMALE";}}
foreach (1..5) { &gender();  print "\n"; } 

或这个:

sub gender { if ( rand(100) >= 50 ) {return "MALE  ";}  else {return "FEMALE";}}
foreach (1..5) { print &gender(), "\n"; }

另外,请注意&gender,带 & 但不带括号的 是一种特殊形式的函数调用,通常不是人们想要使用的;删除 & 或在您的通话中添加空括号。

我还更正了 if 测试以返回男性 50% 的时间和女性 50% 的时间,而不是分别返回 49% 和 51%。

于 2010-10-31T07:17:43.480 回答
8

让我们用你的代码来习惯用法:

print gender(), "\n" 
    for 1..5;

sub gender {
    return  int rand(100) > 50 ? 'MALE' : 'FEMALE';
}

那么,我做了什么?

第一的:

  1. gender不应使用 the 和没有括号调用sub &。这会在传递给调用者的参数上调用子例程。当您有一堆常见的参数清理代码时,这很方便。但这在这里是不可取或不需要的。
  2. 我将 sub 放在其他代码之后,因为我喜欢从高级到具体阅读我的代码——这与 C 强制你组织事物的方式相反。我不喜欢从下往上阅读我的代码,所以我这样做了。这纯粹是个人喜好。做任何让你开心的事。或者,如果您必须与他人合作,请遵循您同意的标准。
  3. 我缩短foreachfor. 他们做同样的事情,一个需要更少的字符。
  4. 我用作for语句修饰符。换句话说,我做了一个简单的声明print $_, "\n";并将其添加for到最后。对于简单的任务,它比使用块更好。再说一次,这是我的看法。有些人谴责语句修饰符是邪恶的和不受欢迎的。如果您决定使用它们,请保持简单。YMMV。
  5. 我摆脱了提到的多余的不需要的打印
  6. 我没有使用大的 if/else 块,而是使用了三元运算符(好吧,它实际上只是一个三元运算符,但人们称它为三元运算)。它计算一个测试值,并根据测试的布尔值返回两个表达式之一的结果。当您想要在分配中使用 if/else 逻辑时,它很方便。
于 2010-10-31T08:52:01.650 回答
2

如果没有明确return的 ,Perl 子程序将返回最后评估的值。 gender返回 1,因为在两个执行路径中,它调用print返回 1。

您应该gender返回一个字符串,调用者然后prints,或者gender进行打印,并且让调用者不对返回值做任何事情。

于 2010-10-31T22:57:08.803 回答
0

谢谢大家帮助我解决这个问题。我找到了一种制作我想要的图表的方法。这是我最终做到的;

print   "GENDER    NAME   AGE   HEIGHT  WEIGHT \n";
foreach (1..10) {                       ## Starting foreach loop
$age    = int(rand( 50))+10;
$height = int (rand(40)) + 50;
$weight = int (rand (100)) + 100;
sub randchar4bit {(chr int rand(25)+65).(chr int rand(25)+65). (chr int rand(25)+65).(chr int rand(25)+65)};
sub gender { return (int rand(100)>50)? "MALE    " : "FEMALE  ";} ;

print gender(), "  ", &randchar4bit,   "    $age     $height      $weight   style 1\n";
}; ## closing foreach loop 

它会生成一个不错的输出:

GENDER    NAME   AGE   HEIGHT  WEIGHT
FEMALE    HHRN    41     67      165   style 1
MALE      HNMF    27     63      187   style 1
MALE      NLDB    26     54      165   style 1
FEMALE    REMB    33     71      118   style 1
MALE      TWEW    10     57      122   style 1
MALE      OCSC    35     80      168   style 1
FEMALE    TKTR    25     64      179   style 1
MALE      GMYN    47     73      123   style 1
MALE      YKUG    50     79      148   style 1
FEMALE    HDFW    47     73      159   style 1
于 2010-11-01T00:42:37.007 回答