このスクリプトが可能にすること
カンマ区切りの数字が羅列されたファイルを読み込んで、カンマで区切られた要素数を合計して出力に表示する。その際、重複した要素はいくつ重複していても1個としてカウントする。
使い方
第1引数にカンマ区切りの数字が羅列されたファイル名を入力して実行する。
スクリプト内容
#!/bin/perl -w
open(IN,$ARGV[0]);
$_ = <IN>;
close(IN);
chomp;
%uniq = map { $_=>1 } split(/,/);
@_ = sort { $a <=> $b } keys %uniq;
$num = $#_ + 1;
print("$num\n");
スクリプトの説明
1行目:シェバン。警告スイッチを一応つける。
2行目: コマンドライン引数の1個目のファイルを読み込み
3行目: 1行取り出してデフォルトスカラ変数に代入
4行目: ファイルハンドラクローズ
5行目: デフォルトスカラ変数の改行コード除外
6行目: デフォルトスカラ変数$_をカンマ区切りで分割してできた配列のそれぞれの要素に対してmaoで処理を実行。処理内容は配列の要素をキーに、値を1にしたハッシュを生成して配列変数%uniqに代入するというもの。
7行目: %uniqのキーを取り出してできた配列を昇順で並び替えてデフォルト配列変数に代入
8行目:前作業でできた配列の最後の要素を「$#_」でとりだして1加算したものを$numに代入
実行結果
[lisa@sara 001.countElments]$ cat countElements.pl
#!/bin/perl -w
open( IN, $ARGV[0] );
$_ = <IN>;
close( IN );
chomp;
%uniq = map { $_=>1 } split( /,/ );
@_ = sort { $a <=> $b } keys %uniq;
$num = $#_ + 1;
print( "$num\n" );
[lisa@sara 001.countElments]$ cat testelement
a,b,c,d,e,f,g,g
[lisa@sara 001.countElments]$ perl countElements.pl testelement
Argument "b" isn't numeric in sort at countElements.pl line 7.
Argument "c" isn't numeric in sort at countElements.pl line 7.
Argument "d" isn't numeric in sort at countElements.pl line 7.
Argument "a" isn't numeric in sort at countElements.pl line 7.
Argument "g" isn't numeric in sort at countElements.pl line 7.
Argument "e" isn't numeric in sort at countElements.pl line 7.
Argument "f" isn't numeric in sort at countElements.pl line 7.
7
[lisa@sara 001.countElments]$
対象の要素が文字列の場合は数値ソートでエラー吐くけど要素数を知るという目的だけは達成できた。エラーが恥ずかしいのでもう少し改良の余地はあると思う。