簡體   English   中英

使用 perl 生成數字序列

[英]Generating a number sequence using perl

我正在嘗試使用 perl 生成如下的數字序列:

1
2 3
4 5 6
7 8 9 10
11 .. n

其中 n 是用戶輸入。 所以我想出了下面看起來很新手的邏輯。 希望有人能做得更好。

$a   = <STDIN>;
$ln  = 1;
$val = 1;
$itr = 1;

do {
    do {
        if ($val <= $a) {
            print "$val\t";
        } else {
            print "\n";
            exit;
        }
        $val++;
        $itr++;
    } while($itr <= $ln);
    $ln++;
    $itr = 1;
    print "\n";
} while ($a > 0);

歡迎使用 Perl 和 StackOverflow。 我有幾點建議給你:

  • 始終包括use strict; use warnings; 在每個 perl 腳本中。

  • 不要忘記chompSTDIN提取的輸入。

  • 避免使用帶有語句修​​飾符的do BLOCK 而是始終使用whilefor循環。

  • 避免使用$a$b作為變量名,因為它們是為sort保留的。

應用這些更改,並使其能夠使用數學來確定我們是否在行尾,給出以下腳本:

use strict;
use warnings;

chomp(my $number = <STDIN>);

my $line = 1;

for my $iter (1 .. $number) {
    if ($iter == $line * ($line + 1) / 2 || $iter == $number) {
        print "$iter\n";
        $line++;
    } else {
        print "$iter\t";
    }
}

輸出(輸入為 17):

17
1
2       3
4       5       6
7       8       9       10
11      12      13      14      15
16      17

使用二次方程的替代方法

也可以使用單個語句獲得幻想並實現相同的輸出:

my $number = 17;

for (1 .. $number) {
    print $_, ((sqrt(8 * $_ + 1) - 1) / 2) !~ /\./ || $_ == $number ? "\n" : "\t";
}
#!/usr/bin/perl
use strict;

my $number = 1;
print "Enter a number: ";
my $n = <STDIN>;


for ( my $i = 0; $i < $n ; $i++)
{
  for (my $j = 0; $j < $i ; $j++)
   {
     while ($number<=$n)
     {
        print "$number ";
        $number++;
        last;
     }
   }

  if ( $number <= $n)
  {
    print "\n";
  }  
}

不錯的編輯。 您的代碼有效,但我想采用非標准方法,在您的答案中提出一些改進建議。

這不是典型的方法,在您有機會考慮這些信息之后,我們可以(並且可能應該)編輯掉這一部分。 但是,由於您是剛剛開始幫助其他程序員的人,我想做出一些特別的努力:

  • 始終包含兩者use strict; use warnings; 在每個 perl 腳本中。

    這是我們可以與任何初級 Perl 程序員以及相當多的中級程序員分享的 #1 技巧。 每當新程序員不使用這些 pragma 時,最好首先將其指出給他們。 這在聲譽低於 10 的新 SO 用戶中最為常見。 始終在我們演示的代碼中對這些編譯指示的使用進行建模也是一個好主意,即使它對示例的功能並不重要。

  • 研究perlstyle以獲取建議的 perl 代碼格式提示。

    當然,每個人都有權擁有自己的風格,但是您會發現大多數 perl 編碼人員都采用了某些間距標准。 這不是規則,只是建議。 但是您會注意到,我將在對您的代碼進行微調時更改格式。

  • 選擇有意義的變量名稱。

    永遠不要使用單字母變量名。 這不僅是為了其他編碼員的利益,也是為了您自己 6 個月后的利益。 為變量指定一個有意義的名稱總是值得的,因為這是使代碼自文檔化的#1 方式。

     #!/usr/bin/perl use strict; use warnings; print "Enter a number: "; my $max = <STDIN>; my $number = 1; for ( my $row = 0; $row < $max ; $row++) { for (my $col = 0; $col < $row ; $col++) { while ($number <= $max) { print "$number "; $number++; last; } } if ( $number <= $max) { print "\\n"; } }

    任何時候您想使用基本變量名時,請改用默認變量$_

     for (MIN .. MAX) {

    如果$_由於某種原因不起作用,那么您應該使用有意義的變量名稱。

  • 總是chomp來自<STDIN>輸入

    無論在這種特殊情況下,您的腳本都可以正常工作。 然而,有相當多的問題被張貼在這個網站上,因為一些初學者沒有chomp他們的輸入,然后他們試圖在open語句中使用文件名或在比較中使用變量。

    為了避免這些微妙的錯誤並只是為了塑造良好的習慣,即使不是絕對必要的,也要始終以演示chomp輸入為目標。

     chomp(my $max = <STDIN>);
  • 我建議使用計數循環,而不是 C 風格的 for 循環。

    此外,由於您只是在數數,我建議從 1 開始並以您的最大數字結束:

     for my $row ( 1 .. $max ) { for my $col ( 1 .. $row ) {
  • 你使用了一段while (COND) {...; last;} while (COND) {...; last;}與簡單的if語句同義:

     if ($number <= $max) { print "$number "; $number++; }
  • 你實際上在迭代什么?

    如果您考慮一下,您實際上是在嘗試迭代$number變量。 變量$row$col實際上是用於格式化的狀態變量。 因此,將您的邏輯完全反轉為以下內容是有意義的:

     #!/usr/bin/perl use strict; use warnings; print "Enter a number: "; chomp( my $max = <STDIN> ); my $row = 1; my $col = 1; for my $number ( 1 .. $max ) { if ($col == $row || $number == $max) { $row++; $col = 1; print "$number\\n"; } else { $col++; print "$number "; } }

    這個最終版本的好處是不會不必要地循環遍歷不會被打印的行。 它也與我的第一個解決方案有一個不出所料的相似之處,除了它包含兩個狀態變量而不是我的只有 1 個。

總的來說,我認為這個最終解決方案實際上可能是對這個 OP 所在的初學者程序員的更好建議,所以我會投票支持這個答案。 閱讀這些評論后,請隨時刪除除最終答案之外的所有內容。

注意:我再也不會編輯這樣的問題了。 通常,實踐只是編輯問題並在編輯摘要中提供解釋。 但是,我有很多東西想與大家分享,希望能在未來為您提供幫助。 歡迎來到 SO,也感謝您幫助他人。

要回答原始問題的字面標題,或在 perl 中生成有限的整數序列:

#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper qw(Dumper);
my @monthn = (1..12);
print Dumper \@monthn;

這會產生

$VAR1 = [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12
        ];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM