No.4ベストアンサー
- 回答日時:
や関連資料で勉強しましょう。
C言語は大体理解できる、ということなので、Cの配列と同じようにPerlの配列を考えているように思えます。
作ろうとしているプログラム、まるでC言語の練習問題のみたいですが
たしかに、C言語でやるなら、
サイズを入力→mallocで必要なサイズを用意
となるでしょう。
対して、Perlの配列は伸縮自在です。
my @a ;
で空の配列を用意して
print $a[5] ;
としてもまったく問題ありません。(値は未定義値(undef)になります。)
$a[8] = 5 ;
とすると、@aのサイズが勝手に増えます。
(C言語のような)他の変数の領域にアクセスする、といったことは発生しますん。
https://perldoc.jp/docs/perl/5.36.0/perlfunc.pod
push,pop,shift,unshit、splice等で追加削除できます。
Perlでは配列のサイズ、配列自身から簡単に調べることができます。
Cにように別途渡す必要はありません。
全ての要素を順番に処理するなら、 foreach 構文も使えます。
C言語のやり方は参考になりますが、それに固執してPerlでやろうとするとかえって難しくなることがあります。
Perlの特徴を理解し、Perlでやりやすい方法を考えるのがよいでしょう
回答ありがとうございます。
おっしゃる通り、あるプログラム入門サイトの問題なのです^ー^うまくいかず質問した次第です。
C言語と違ってperlは独特な自由な感じなのでなかなか難しいですが教えていただいたサイトを見て色々試してみたいと思います。
ありがとうございました。
No.5
- 回答日時:
「値渡し」かどうかと「標準入力から2次元配列の行数と列数を読み込んで」うんぬんとは無関係なんだ.
で「値渡し」が「サブルーチンの中で配列中の値を変更しても元の配列では値が変わらないようにしたい」ということなら, 例えば
https://kasei-san.hatenadiary.org/entry/20081121 …
のようにがんばって deep copy するしかないと思う.
No.3
- 回答日時:
サンプルです。
my $var = <STDIN>;
chomp($var);
(my $row,my $col) = split(/\s+/,$var);
print "row=$row column=$col\n";
my @arr = ();
for (my $i = 0; $i < $row; $i++){
$var = <STDIN>;
chomp($var);
my @line = split(/\s+/,$var);
if (scalar(@line) != $col){
print "invalid column size\n";
exit(10);
}
for (my $j = 0; $j < $col; $j++){
$arr[$i][$j] = $line[$j];
}
# 下記行でも同じ結果になる
#$arr[$i] = [@line];
}
print "---main ----\n";
for (my $i = 0; $i < $row; $i++){
for (my $j = 0; $j < $col; $j++){
print "$arr[$i][$j] ";
}
print "\n";
}
pout(\@arr);
sub pout{
(my $arr_ref) = @_;
my @p_arr = @$arr_ref;
my $p_row = scalar(@p_arr);
my $p_col = scalar(@{$p_arr[0]});
print "---pout----\n";
print "row=$p_row column=$p_col\n";
for (my $i = 0; $i < $p_row; $i++){
for (my $j = 0; $j < $p_col; $j++){
print "$p_arr[$i][$j] ";
}
print "\n";
}
}
-----------------------------------------
実行結果
2 3 ・・・入力
row=2 column=3
aa bb cc ・・・入力
dd ee ff ・・・入力
---main ----
aa bb cc
dd ee ff
---pout----
row=2 column=3
aa bb cc
dd ee ff
補足
2は行数 3は列数です。
回答ありがとうございます。
サンプル動かしてみました。mainとpoutで同じ出力になりました。
しかし、値渡しではなく自分もよく理解できていないリファレンス(参照?)渡しになっているみたいで、poutの中で値を変更すると、poutから抜けても元の値に戻らず変更した値のままでした。値渡しする方法はあるでしょうか。
No.2
- 回答日時:
「各要素が配列へのリファレンスであるような配列」というのは結局のところ「配列」なんだから, 本質的には「1次元」のときと何もかわらない.
んだけど, なにをいっているのかわからないところがさしあたり 2点ある.
・「動的に受け取る」ってどういうこと? 「誰が」「誰から」「何を」動的に受け取るのかな?
・「標準入力から受け取ったサイズは受け取るまでサイズがわからない」は日本語として意味がわからない. 標準入力から例えば「18」という「サイズ」を受け取るとして, 「18」という値ではなく (その「18」という値の属性としての) 「サイズ」とやらがわからないっていう文章なんだよね. でも, その意味の「サイズ」ってなんの意味があるの?
回答ありがとうございます。
なにやら考えが曖昧な段階で質問をしてしまって混乱させてしまってすみません。もっと勉強して意図する事を伝えれるようになってから質問したいと思います。(意図を汲み取ってもらえるんじゃないかという甘えがありましたすみません><リファレンスもよくわかっていません><)
・動的に受け取るというのはプログラムが標準入力から2次元配列のデータを受け取る際にどのような変数で受け取ればいいかということです。
・サイズがわからないというのはプログラムを記述する段階では標準入力から受け取る2次元配列のデータの大きさがわからないから、どういう変数で受け取ったらいいかがよくわからないです。
初心者ですが頑張りたいと思います。よろしくお願いします。
No.1
- 回答日時:
「各要素が配列へのリファレンスであるような配列」を作ってもいいし, 「各要素が配列へのリファレンスであるような配列リファレンス」を作ってもいい.
ちなみに「2次元配列」ではなくて「1次元配列」だとしたらどうしてる?
回答ありがとうございます
ネットで調べたらやはりリファレンスを使うとのことでしたが、標準入力から受け取ったサイズは受け取るまでサイズがわからないので、動的に受け取るやり方がよくわかりません。
配列を渡すときは1次元が1つだけだったら引数の一番最後に配列を渡すとうまく渡すことができると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
Excel VBA ユーザーフォームの...
-
複数の配列の全ての組み合わせ...
-
VB6で配列の最大値を簡単に求め...
-
二次元配列のインデックスについて
-
MATLABの関数で配列の要素を返...
-
FORTRAN90で書式に変数を使いたい
-
2次元配列がわかりやすく記述...
-
perlで配列の要素が空なのを知...
-
二次元配列における要素数のは...
-
VBScript 配列
-
エクセルVBAでTransposeの不思議
-
サブルーチンの戻り値
-
Perlで<select multiple>の複数...
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
ListBox 複数選択 で オートフ...
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
再帰関数のインライン展開
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dim flag(4) as boolean で配列...
-
VBAのautofilter、criteriaの配...
-
二次元配列のインデックスについて
-
二次元配列における要素数のは...
-
エクセルVBAでTransposeの不思議
-
クラスに配列を渡す方法
-
リストボックスに縦スクロール...
-
マクロ Publicでの配列定義
-
Excel VBA ユーザーフォームの...
-
文字の整列(printf)
-
perlで配列の要素が空なのを知...
-
perl 配列の要素数について
-
Strawberry Perl for Windows ...
-
VBA 二次元配列の1つ目を増...
-
チェックボックスのperlでの値...
-
perl 初等プログラミングについて
-
DBIを使ってSelect文 複数のカ...
-
複数のキーで配列をソートする...
-
newで個別に生成した配列にNULL...
-
Excel(VBA)で配列の要素数を...
おすすめ情報