アプリ版:「スタンプのみでお礼する」機能のリリースについて

perlなど初心者です。
awkでレコードのフィールドを$1、$2などと参照できるのが便利だなと感じているのですが、perlでもコマンドラインで同じ事をするにはどうすればよいでしょうか?

A 回答 (2件)

コマンドラインオプション -a (と-F)を使います。



perldoc perlrun
すると細かい説明がわかります。
-a
turns on autosplit mode when used with a -n or -p. An implicit
split command to the @F array is done as the first thing inside the
implicit while loop produced by the -n or -p.

perl -ane 'print pop(@F), "\n";'

is equivalent to

while (<>) {
@F = split(' ');
print pop(@F), "\n";
}

An alternate delimiter may be specified using -F.

@F という配列に入力行を分割して格納します。
awk でいうところの print $1, $2 は
print $F[0], $F[1], "\n";
になります。
配列が0オリジンになることに注意してください。
awkでの$0は、この場合は $_ という変数に入っている値になります。
    • good
    • 0
この回答へのお礼

ありがとうございました。大変参考になりました。^^

お礼日時:2007/03/13 23:33

「コマンドラインで」という限定になると結構面倒な事になります。



例えば、
echo "aaa,bbb,ccc" | awk -F"," '{ printf( "%s:%s\n", $1, $2 )}'
をperlのコマンドラインで”同じ意味合い”で再現しようとすると
perl -e "@a = split(\",\",\"aaa,bbb,ccc\");print \$a[0] . \":\" . \$a[1] . \"\\n\";"

という感じになりますw
#同じ意味合い・・","で分けた1つ目と2つ目を":"でつなげて出力

$1,$2を使う形だとこんな感じです。
perl -e "\$buff = \"aaa,bbb,ccc\";\$buff =~ s/^(.*?),(.*?),(.*?)\$/\$1:\$2/;print \"\$buff\n\";"
#正規表現を使った形です。

perlはあくまでもプログラム言語なので、実装の制限(例えば、返り値を変数に入れてからしか使えないとか)や
機能が汎用的であるが故に、利用するには手続きがいるなど
コマンドラインで実行しようとするとどうしても機能特化した
UNIXコマンドには負けてしまいがちです。

ただし、awkコマンド自体はプログラムですから
当然perlでも同様のプログラムを作る事ができます。

##########################
パンは、小麦粉から作られている。
当然小麦粉よりもパンの方がおいしい。
でも、パンからうどんは作れないけど
小麦粉からうどんは作れる。
要するに、パン(awk)という特化したものはそれ単体で見ると
優れていて、汎用的な小麦粉は勝てないが
パンからうどんという特化したものを作る事はできない。
しかし、小麦粉はうどんを作る事ができる(謎)
    • good
    • 0
この回答へのお礼

ありがとうございます。なるほど。難しいですね。
おっしゃっていることは分かりました。^^

お礼日時:2007/03/13 23:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!