Perl初心者です。
「Learning Perl」(オライリー社、第5版)を勉強中なのですが、4章の練習問題3でつまずいています。
#!/usr/bin/perl
use strict;
sub total {
my $sum;
foreach (@_) {
$sum += $_;
}
$sum;
}
sub average {
if(@_ == 0) {return}
my $count = @_;
my $sum = total(@_);
$sum/$count;
}
sub above_average {
my $average = average(@_);
my @list;
foreach my $element (@_) {
if($element > $average) {
push @list, $element;
}
}
@list;
}
my $average = average(100, 1..10);
print "\$average = $average\n";
my $barney = above_average(100, 1..10);
print "\$barney = $barney\n";
とやったのですが、結果が
$average = 14.0909090909091
$barney = 1
となってしまいます。
($averageの値は正しいのですが、$barneyの値が100となってほしいのに、1になってしまっています。)
すみませんが、識者の方、どこが悪いのか、ご教授お願いします。
No.1ベストアンサー
- 回答日時:
above_average では、「@list」すなわち、平均値以上の値を持つ要素の配列を返してます。
一方、その呼び出し部では「my $barney = above_average(100, 1..10);」で、$barney というスカラー変数で受けています。
配列をスカラーコンテキストで評価すると、その配列の要素数になりますので、
$barney には、above_average の結果の「平均値以上の値を持つ要素の数」が代入されます。
つまり、1になります。
「100」すなわち、結果の最初の要素を得たいのなら、
---ここから---
my($barney) = above_average(100, 1..10);
---ここまで---
これで、「($barney)」という配列に、above_average の返した配列が代入されますので、
$barney には、その最初の要素である100が代入されます。
あるいは、平均以上の要素を全て表示したいのなら、
---ここから---
my @barney = above_average(100, 1..10);
print "\@barney = @barney\n";
---ここまで---
のように配列変数で受けてください。
さっそく素晴らしい回答をくださいまして、ありがとうございました。
本のページ上でも、ちゃんと
my @barney = above_average(100, 1..10);
print "\@barney = @barney\n";
となっていました。
@を$と一文字書き間違えてただけで、コンパイルエラーにもならずに全然違った結果が得られるんだということを、身に染みて理解できました。
たいへん勉強になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) AVERAGE関数とINDIRECT関数を使ってのオートフィル 3 2023/01/12 12:00
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Excel(エクセル) Excelで縦1列に並んだ大量の数字から、一定間隔で平均値を出したい。 2 2023/02/20 09:17
- 面接・履歴書・職務経歴書 特許事務所、一般事務の志望動機の添削お願いします。 具体的に指摘していただけると助かります。 ↓ 私 3 2023/02/09 18:25
- Excel(エクセル) エクセル・セルに数式を入力してセル指定計算 2 2023/04/21 12:46
- 英語 No significant differences between the studied gro 5 2022/10/25 22:53
- 英語 英文についての質問です。 They also help slow biological aging, 1 2023/07/02 11:50
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- 統計学 統計分析とExcelに詳しい方、何卒よろしくお願いいたします。 6 2022/05/27 10:30
- 英語 No significant differences between the studied gro 1 2022/10/26 01:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl の外部モジュールの利用方法
-
ファイルアイコンの左下に緑の□...
-
perlのプログラミング 部分入れ...
-
ペプシコーラとコカ・コーラとD...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
-
perlについての質問
-
Blenderについて
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
秀丸での一括変換について
-
英数文字列のうちの数値を4桁に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Can't use string ("0") as an ...
-
行指向処理でデータの読み込み...
-
サンプルの意味
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
VBAのautofilter、criteriaの配...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
ハッシュ検索はなぜ速い
おすすめ情報