スカラ型なら
my $a = "a";
my $b = "b";
if( $a eq $b)の用に比較が簡単に出来ますが、
配列やハッシュはどのように中身が同じかどうか調べることは可能でしょうか?
配列でも複雑な(例えば配列のデータがハッシュ値)のような以下の
ものを中身が同じが比較する方法です。
固定でなく、どんなデータが入ってきても数やキーが異なっても比較する方法が知りたいです。
my @ary1 = ();
$ary[0]{'test_a'} = "a";
$ary[0]{'test_b'} = "b";
$ary[1]{'test_a'} = "aa";
$ary[1]{'test_b'} = "bb";
my @ary2 = ();
$ary[0]{'test_a'} = "aa";
$ary[0]{'test_b'} = "bb";
$ary[1]{'test_a'} = "aaa";
$ary[1]{'test_b'} = "bbb";
No.6ベストアンサー
- 回答日時:
Test::Deepのeq_deeply()が簡単で使いやすいです。
ハッシュでも、配列でも何でも比較できるみたいです。例題であれば↓
use Test::Deep;
my @ary1 = ();
$ary1[0]{'test_a'} = "a";
$ary1[0]{'test_b'} = "b";
$ary1[1]{'test_a'} = "aa";
$ary1[1]{'test_b'} = "bb";
my @ary2 = ();
$ary2[0]{'test_a'} = "aa";
$ary2[0]{'test_b'} = "bb";
$ary2[1]{'test_a'} = "aaa";
$ary2[1]{'test_b'} = "bbb";
if(eq_deeply( \@ary1, \@ary2, 'Compare array' )){
print "Same structure\n";
}else{
print "Different structure\n";
}
No.5
- 回答日時:
とりあえず,「中身を見る」のが先決だと思うので,
Data::Dumper を使うというのはどうでしょうか.
Dumperで文字列にして
それを「文字列として」比較しています.
Test系のモジュールに
この手の比較に特化したものがあるかもしれませんね
use strict;
use warnings;
use Data::Dumper;
my @ary1 = (
{'test_b' => "b"},
{'test_a' => "aa"},
{'test_b' => "bb"},
);
my @ary2 = (
{'test_b' => "c"},
{'test_a' => "aa"},
{'test_b' => "bb"},
);
if (Dumper(@ary1) eq Dumper(@ary2)){
print "EQ";
}else{
print "NOT EQ";
}
No.4
- 回答日時:
あ, 言い忘れてた. 「中身が複雑」だとすると, 「同じ」かどうかの判定から考えないとダメですね.
例えば,
$a = [ 1 ];
$b = [ 1 ];
としたときに, $a と $b は「別のリファレンス」だけど「同じデータを持つ配列」のリファレンスではあるわけで, このときに「同じ」とするか「違う」とするかという問題があります.
もっとも, 「中身が複雑」で「簡単にチェック」は矛盾してるような気がするなぁ....
No.3
- 回答日時:
ん~, それぞれのデータ型に応じて適切に比較するサブルーチンを作り, 再帰的にチェックするしかないんじゃないかなぁ?
例えば, 配列だと
sub check_array($$) {
my ($array1, $array2) = @_;
return 0 if $#$array1 != $#$array2;
for my $i (0 .. $#$array1) {
my $type1 = ref $array1->[$i];
my $type2 = ref $array2->[$i];
return 0 if $type1 ne $type2;
return 0 if ! $check{$type1}->($array1->[$i], $array2->[$i]);
}
1;
}
みたいな. あ, %check は
%check = (
SCALAR => \&check_scalar,
ARRAY => \&check_array,
...);
みたいにデータ型に対して比較ルーチンを記憶しておくハッシュです.
No.2
- 回答日時:
単純にループを積み重ねただけです。
foreach my $index_1 (0 .. $#ary1) {
foreach my $key_1 (keys %{$ary1[$index_1]}) {
foreach my $index_2 (0 .. $#ary2) {
foreach my $key_2 (keys %{$ary2[$index_2]}) {
if ($ary1[$index_1]->{$key_1} eq $ary2[$index_2]->{$key_2}) { ... } # 値のみ同じ
# if ($key_1 eq $key_2 && $ary1[$index_1]->{$key_1} eq $ary2[$index_2]->{$key_2}) { ... } # キーと値が同じ
}
}
}
}
No.1
- 回答日時:
@ary1と@ary2の比較ならそれなりの処理が必要です
>固定でなくどんなデータが入ってきても数やキーが異なっても比較する方法
例えにある配列を比較するならこんな感じでしょうか・・・
※素人なのでスマートでカッコイイのは書けませんm(_ _;m
my @ary1 = ();
$ary1[0]{'test_a'} = "a";
$ary1[0]{'test_b'} = "b";
$ary1[1]{'test_a'} = "aa";
$ary1[1]{'test_b'} = "bb";
my @ary2 = ();
$ary2[0]{'test_a'} = "a";
$ary2[0]{'test_b'} = "bb";
$ary2[1]{'test_a'} = "aaa";
$ary2[1]{'test_b'} = "bbb";
if($#ary1 != $#ary2){
print "配列の数が異なる\n";
}else{
for($i=0;$i<=$#ary1;$i++){
if(join(",",sort keys(%{$ary1[$i]})) ne join(",",sort keys(%{$ary2[$i]}))){
print "\$ary1[$i]と\$ary2[$i]には異なるキーが存在\n";
}else{
foreach $key (sort keys(%{$ary1[$i]})){
if($ary1[$i]{$key} ne $ary2[$i]{$key}){
print "\$ary1[$i]{'$key'}と\$ary2[$i]{'$key'}は不一致\n";
}else{
print "\$ary1[$i]{'$key'}と\$ary2[$i]{'$key'}は一致\n";
}
}
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- サーバー Windowsサーバでグループを検索したい 1 2023/04/17 15:30
- システム ホームページの仕組みについて 3 2022/08/16 14:33
- Visual Basic(VBA) Excle VBA Findメソッドについて 3 2022/07/15 13:56
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- Excel(エクセル) Excelの置換が上手くいかない Microsoft® Excel® 2019 MSO (バージョン 5 2022/08/17 22:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlで2つの配列を比較する方...
-
ハッシュのハッシュの値代入で...
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
画面を強制的に再描画させる方法
-
VBAのautofilter、criteriaの配...
-
CSVの3行目だけを…
-
エディットボックスのテキスト...
-
プログラミングについて。 1つ...
-
チェックデジットについて
-
DOSコマンドのループ内のTIMEコ...
-
VBのReturnの使い方
-
ボタンが押された時にループか...
-
19歳です 普段、動くことも人と...
-
Java 南京錠
-
Application->Run();の機能につ...
-
UWSCのスクリプトで行き詰って...
-
UTF-8で書かれたJSPの日本語文...
-
alarmの使用について
-
テキストボックスの名前に変数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベースから取得したデー...
-
perlで2つの配列を比較する方...
-
DBIを使ってのデータの取り出し...
-
python質問
-
perlでファイルの拡張子を除い...
-
アルファベットn文字の組み合わ...
-
grep関数を用いた複数行からの抽出
-
乱数と順列と組み合わせ
-
半角文字の縦書き表示
-
配列やハッシュで中身が同じか...
-
ループ中でのmy宣言と処理速度
-
桁数指定と四捨五入
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
おすすめ情報