Nano Hash - криптовалюты, майнинг, программирование

Проходя Hash of Hash в Perl?

Когда я пытаюсь уважать сохраненную ссылку (которая устанавливается в подпрограммах извлечения данных Tripwire/get Data) и конвертировать ее обратно в хэш (в подпрограмме сравнения), т.е. %hash = %{$DataHash{$key}}; , и я пытаюсь напечатать ключи. Я сталкиваюсь с этими проблемами:

Использование неинициализированных значений $hash{"ElementName"} при разыменовании массива в строке... Это at @hashItems = @{$hash{ElementName}}; линия

Использование неинициализированного значения в print at .... print "Data: ", $hash{ElementName}, "\n"; линия

sub extract_tripwire{

    foreach $server (@servers){

        $server = lc $server;

        my $xlfile = "";
        $xlfile .= "";


        # Open the provided Excel sheet
        my $book = $xl->Workbooks->Open($xlfile);

        # Setip active worksheet
        my $sheet = $book->Worksheets(1);

        # Finds the Last row that has data in it
        my $LastRow = $sheet->UsedRange->Find({What=>"*",
            SearchDirection=>xlPrevious,
            SearchOrder=>xlByRows})->{Row};

        my $LastCol = $sheet->UsedRange->Find({What=>"*", 
              SearchDirection=>xlPrevious,
              SearchOrder=>xlByColumns})->{Column};

        print "Last Row: $LastRow, Last Column: $LastCol\n";

        #This will be a reference to a hash
        if($LastRow > 1){
            my %Data = %{&get_Data($LastRow,$LastCol,$sheet)};
        }
        else{
            print "No program Changes\n";
        }

        # Close the workbook when done
        $xl->ActiveWorkbook->Close(0);

        #Maybe Store a reference to the hash?
        $DataHash{$server} = \%Data;
    }

    # Get the names of the columns from the given excel file
    sub get_Data{
        # Initialization of variables 
        my @header;
        my @data;
        my %Data;

        # Print out all the data
        my $array = $_[2]->Range("A1:I1")->{'Value'};

        # Cycle through A1->I1 , A1->B1->C1->D1...
        foreach my $ref_array (@$array){
            foreach my $scalar(@$ref_array){
                    push @header, $scalar;
            }
        }

        #The letters that are associated with the columns of the excel file
        my @letters = ('A','B','C','D','E','F','G','H','I');

        my $counter = 0;

        # Loop through all the columns and store the data within a hash with the specific header as its key
        for($index = 0; $index < scalar @letters; $index++,$counter++){
            # The range of the column
            my $array = $_[2]->Range("$letters[$index]2:$letters[$index]$_[0]")->{'Value'};

            # Cycle through A2->I4 , A2->A3->A4->...->I2->...
            foreach my $ref_array (@$array){
                foreach my $scalar(@$ref_array){
                    if(defined($scalar)){
                        push @data, $scalar;
                    }
                    else{
                        $scalar = " ";
                    }
                }
            }
                $Data{$header[$counter]} = @data;
                @data = ();                             
        }
        # Return the data hash
        return \%Data;
    }

    &Compare(\%DataHash);
}
sub Compare{
    # Get the hash of a has that was created from the tripwire reports
    my %Datahash = %{$_[0]};

    # Get the keys of that file
    @keys = sort keys %DataHash;

    foreach(@keys){
        print "Keys: $_\n";
    }

    #Loop through the keys
    foreach my $key (@keys){
----------> #This is the Main PROBLEM in the code
----------> %hash = %{$DataHash{$key}};

        # Get all the keys of that hash
        @hashKeys = keys %hash;

                    print "Data: ", $hash{ElementName}, "\n";

        #Get the items Programs that has been implemented
        @hashItems = @{$hash{ElementName}};

        #Try and match them up against the Task from Alfresco
        for($i = 0; $i < scalar @hashItems;$i++){
            for($j = 0; $j < scalar @promoCode; $j++){
                #Split up the PromoCode Here!!!! 0- File name, 1- Task #
                #If a match has been found
                if($hashItems[$i] ~~ $promoCode[$j]){
                    # Extract the row that match
                    foreach (@hashKeys){
                        @array = @{$hash{$_}};
                        #And store it in this array
                        push @pass, $array[$i];
                    }
                    # So that the information can be passed to the Reconcile routine to be added to the Details and Summary reports + Task #
                    &Reconcile(@pass,$i);

                    #Need insert and empty row
                    $sheet->Range("A$lastRow:G$LastRow")->Select;
                    $xl->Selection->Interior->{ColorIndex} = 15;
                    $xl->Selection->Interior->{Pattern} = xlSolid;
                }
            }
        }

    }
}'

Есть ли проблема с тем, как я создаю хэш хэша? Как я это читаю?


  • Программа выдает какую-то ошибку? Вы работаете с включенными предупреждениями? Вы работаете в строгом режиме? 17.08.2011
  • укажите, где ваш код доставляет вам проблемы, вместо того, чтобы доказывать весь код. 17.08.2011

Ответы:


1

Если речь идет об отладке вашего кода, могу ли я предложить использовать Data::Dumper для напечатать свой хеш? Он должен предоставить вам достаточно информации, чтобы разобраться в перегибах.

use Data::Dumper;
print Dumper \%hash;
17.08.2011
  • Я, что помогает в отладке. Спасибо! 17.08.2011

  • 2

    Ну, во-первых, это утверждение:

    $Data{$header[$counter]}  = @data;
    

    присвоит размер массива @data хэш-значению, возможно, не то, что вы предполагали!

    чтобы назначить массив, вам нужно сделать это:

    @{ $Data{$header[$counter]} } = @data
    
    17.08.2011
  • или $Data{$header[$counter]} = \@data;, в котором хранится ссылка на скаляр, а не массив на разыменованный скаляр. Это то же самое, но намерения яснее и читабельнее. 17.08.2011
  • нет, это совсем не одно и то же. чтобы этот подход работал, my @data; должен быть рядом с my $array, поэтому для каждой итерации используется новый массив (и @data = () становится ненужным) 17.08.2011

  • 3

    Это незачем:

    foreach my $scalar(@$ref_array){
        push @header, $scalar;
    }
    

    как проще сказать:

    push @header, @$ref_array;
    

    Но что касается вашей большой проблемы, строка 88 (по моим подсчетам):

    &Compare(\%DataHash);
    

    Поскольку %DataHash не определено, у вас, вероятно, нет strict. Это означает, что он создает переменную пакета %main::DataHash, которая является пустым хешем, и передает ссылку на этот пустой хэш. Так что это только цифры, что $DataHash{ElementName} будет undef.

    Поскольку вы имели дело с %Data, вы, вероятно, хотели сделать это:

    Compare( \%Data );
    

    Вам не нужны амперсанды, как вы вызываете суб.

    Итак, это USUW - use strict; use warnings;

    27.09.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..