簡體   English   中英

為什么我的Perl在最后一個循環?

[英]Why is my Perl loop off by one at the end?

我有這個程序不能按預期工作。 幫我。

我想打印一行標題。

如果輸入為4 ,我想輸出1|2|3|4

它並不是全部工作,如果我硬編碼$count值它部分工作但最后一個數字丟失。

sub printC {
        my $count = @_;
        # count = 4  # works partially only prints 1|2|3
        for(my $i=1;$i<$count;$i++) {
                print "$i|";
        }
        print $i;
}
$count  = 2;
&printC($count);
print "\n";

問題出在這里:

my $count = @_;

賦值發生在標量上下文中,它將數組@_的元素數分配給$count ,大小寫為1 ,因為您將1參數傳遞給函數。

要解決此問題,您可以:

my ($count) = @_; 

要么

my $count = $_[0];

這是另一個問題:

for(my $i=1.....
    ^^

通過使用my ,你做了$i 局部的身體for ,它會無法使用外面 因此,你在for之外的最終print不會印刷任何東西。 要解決此問題,請在循環外部聲明$i

sub printC {
        my ($count) = @_;
        my $i;
        ....

總是要寫點

use strict;

在您的程序的頂部,使您能夠捕獲此類錯誤。

執行函數功能的perl方法是:

print join('|',1..$count);

一個真正的Perl黑客可能會寫這樣的東西:

sub printC {
  my $count = shift;
  print join "|", (1 .. $count);
}

一旦你理解了它是如何工作的,你會發現你已經學到了更多關於Perl的知識。 :-)

一旦你離開for循環, $i就不存在了for因為它聲明了它的位置。

你可以做到

sub printC {
    my ($count) = @_;
    my $i;
    for ($i = 1; $i < $count; $i++) {
        print "$i|";
    }
    print $i;
}

更簡單:

sub printC {
    my ($count) = @_;
    print join("|", 1 .. $count) . "\n";
}

“更多Perlish”的另一點是不使用C風格for循環。 有幾乎從來沒有需要使用C風格for Perl編寫的。

代替

for(my $i=1;$i<$count;$i++) { ... }

使用

for my $i (1 .. $count) { ... }

它們幾乎是等價的,除了后一版本更容易閱讀並且更能抵抗一個一個錯誤。 (原因你的代碼只打印1|2|3代替1|2|3|4是因為在你的C風格測試for在檢查$i<$count時,它應該是$i<=$count - for (list)完全避免使用C風格for循環,這是一個非常常見的錯誤。)

另外,不要使用&子調用的前綴。 這是Perl 4的延續,Perl 5中不再需要它,並且有可能你不知道並且可能不想要的副作用。 只需使用printC($count)代替&printC($count)

但是,是的,在這種特殊情況下, join可能比一個更好的方法for ,無論如何。

暫無
暫無

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

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