更新 添加另一種方法,這一次與發佈方式一致。
遞增字符串中的每個數字,改變字符串到位。重複這一點。以下是兩種方式來做到這一點。另一種方法是按照整數序列讀取單個數字和打印。
(1)用正則表達式。這也符合在單行
echo "1 2 3 4 5" | perl -e '$v = <>; for (1..5) { print $v; $v =~ s/(\d+)/$1+1/eg; }'
這將打印所需的輸出。但更好地把它放在腳本中
use warnings;
use strict;
my $file = 'numbers.txt';
open my $fh, '<', $file or die "can't open $file: $!";
while (my $line = <$fh>) {
# Add chomp($line) if needed for some other processing.
for (1..5) {
print $line;
$line =~ s/(\d+)/$1+1/eg;
}
}
/e
修飾符對此非常重要。它使得正則表達式的替換側被評估爲代碼而不是雙引號字符串。所以你可以在那裏實際執行代碼,在這裏我們添加到捕獲的數字$1+1
,對於每個匹配的數字,因爲/g
向下移動字符串。這會更改字符串,以便for (1..5)
的下一次迭代增加這些等等。我匹配多個數字,\d+
,在您的示例中這不是必需的,但通常會更有意義。
(2)經由split
+ map
+ join
,也重複改變到位線
while (my $line = <$fh>) {
for (1..5) {
print $line;
$line = join ' ', map { $_+1 } split '\s+', $line;
}
}
的split
會從$line
號碼列表並且將其送至map
,其遞增每個,供給它的輸出列表到join
。連接的字符串被分配回$line
,並重復此操作。我拆分了\s+
以允許多個空白區域,但這使得它非常「放寬」它接受的輸入格式,請參閱perlrecharclass
。如果您知道這是一個空格,請將其更改爲' '
。
(3)一次取一個數字並打印從其開始的整數序列。
open my $fh, '<', $file or die "can't open $file: $!";
local $/ = ' ';
while (my $num = <$fh>) {
print "$_ " for $num..$num+4;
print "\n";
}
神奇4
可通過編碼預處理所述整行找到序列長度,通過說
my $len =() = $line =~ /(\d+)/g;
或通過split
-ing到一個數組並考慮其scalar
,然後使用$len-1
。
其他意見。
我建議這三個參數的open,open my $fh, '<', $file
當您檢查調用打印錯誤,die "Your message: $!"
,看到失敗的原因。如果你決定退出,那麼你可能不需要$!
。但是當外線呼叫失敗時不知道之所以需要合適的錯誤變量,最常見的是$!
。
請參閱['當某人回答我的問題時該怎麼辦?](http://stackoverflow.com/help/someone-answers)標記答案(如您所見它適合)對於本網站如何運作非常重要,對於稍後搜索的用戶而言非常重要。 – zdim