perlとawkのsubstr関数の違いにはまった

perlawkのsubstr関数の違いにはまった。文字列から部分文字列を取得するperlスクリプトawkに書き換えたら結果が異なった。
以下は、文字列"abcde"の1文字目から2文字、3文字目から3文字を取得する。

perlの場合

$ echo "abcde" | perl -lne 'print substr($_, 0, 2)'
ab
$ echo "abcde" | perl -lne 'print substr($_, 2, 3)'
cde


awkの場合

$ echo "abcde" | awk '{ print substr($0, 0, 2) }'
ab
$ echo "abcde" | awk '{ print substr($0, 2, 3) }'
bcd

perlawkは、1文字目が0と思ったら、awkは1文字目が1のようだ(substrに2番目の引数)。だけど、以下の結果はすべて同じ、なぜなんだ。

$ echo "abcde" | awk '{ print substr($0, 0, 2) }'
ab
$ echo "abcde" | awk '{ print substr($0, 1, 2) }'
ab
$ echo "abcde" | awk '{ print substr($0, -10000, 2) }'
ab

これは、ドキュメントやソースコードを読めということですね。