как выполнить часть кода незадолго до выхода сценария жемчуга

Существует множество способов сделать это в Excel. Поскольку этот вопрос помечен формулой Excel, я предоставлю некоторые варианты с использованием формул Excel.

Первые два варианта будут зависеть от размещения ваших результатов в матрице. Это работает, потому что у вас есть две опции: ФУНКЦИОНАЛЬНАЯ и ДИСФУНКЦИОНАЛЬНАЯ

В этом примере предполагается, что данные располагаются следующим образом:

Example Table [ 1142]

Вариант 1

Используйте комбинацию INDEX и MATCH. Формула INDEX вернет адрес ячейки / диапазона для данной строки и номер столбца для выбранного диапазона. Он использует следующий формат:

INDEX(SELECTED RANGE,ROW NUMBER, COLUMN NUMBER)

Важно отметить, что номер строки и номер столбца относятся к выбранному диапазону, а не к столбцу рабочего листа. Единственный случай, когда это будет одинаково для обоих, это если выбранный диапазон начался в A1.

На основании этой информации начало формулы будет выглядеть следующим образом:

=INDEX($D$4:$H$8,

Поскольку я обычно не хочу, чтобы выбранный диапазон менялся при копировании в другую ячейку, у меня есть привычка блокировать ссылки на ячейки диапазона с $.

Следующая часть, которая необходима, это указать номер строки. Для этого функция MATCH работает хорошо. Функция MATCH будет искать заданное значение в определенном диапазоне и возвращать его положение в этом диапазоне. Вы также можете установить тип поиска, который вы хотите, в терминах приближенного и ближайшего типа поиска или обратного ближайшего к функции ... обратите внимание, что для работы последних двух необходимо отсортировать диапазон, и для позже для работы этот диапазон должен быть отсортирован в обратном порядке. Общий формат MATCH выглядит следующим образом:

MATCH(WHAT YOU ARE LOOKING FOR, RANGE TO LOOK, SEARCH OPTION)

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

=MATCH($D$12,$C$4:$C$8,0)

0 в конце говорит MATCH, что требуется точное совпадение. Так как это возвращает номер строки, его можно поместить непосредственно в формулу INDEX для номера строки, и формула теперь выглядит следующим образом:

=INDEX($D$4:$H$8,MATCH($D$12,$C$4:$C$8,0),

Теперь необходимо определить номер столбца. Опять же, можно использовать функцию MATCH, и на этот раз диапазон для просмотра будет горизонтальным, а не вертикальным. Поскольку функциональная оценка находится в D11, формула должна выглядеть следующим образом:

=MATCH($D$11,$D$3:$H$3,0)

Так как это возвращает номер столбца выбранного диапазона, мы можем вывести это непосредственно в нашу формулу INDEX, которая заканчивается и выглядит например:

=INDEX($D$4:$H$8,MATCH($D$12,$C$4:$C$8,0),MATCH($D$11,$D$3:$H$3,0))

Опция 2

Эта опция очень похожа и работает с использованием INDEX и небольшим количеством математических манипуляций, основанных на ваших очень специфических параметрах оценки. Таблица очень специфична для этого примера, переходя от наименьшего к наибольшему. Также все ваши оценки делятся на 2, чтобы получить приращение 1 между счетами, -2, -1, 0, 1, 2. Теперь, если вы добавите 3 к этому, вы получите 1, 2, 3, 4, 5, что случается, чтобы соответствовать вашим параметрам для строк и столбцов. Таким образом, если мы заменим MATCH из варианта 1 на этот маленький кусочек математики, то формула INDEX станет такой:

=INDEX($D$4:$H$8,$D$12/2+3,$D$11/2+3)

Вариант 3

Это просто вложенный IF похож на ваш, но группирует результаты вместе, вместо того, чтобы перечислять каждую опцию ячейки. Логика отдельных IF функций не работает сама по себе. Однако они работают в том порядке, в котором они вложены, поскольку, если условие TRUE приводит к одной из предыдущих функций IF, возвращается буква, а остальные уровни функции IF не проверяются. Массивные вложенные функции IF могут быть трудными для чтения, не говоря уже о том, что их трудно поддерживать, когда вы вернетесь через месяц или более и попытаетесь выяснить, что вы сделали. Еще хуже для бедного сока, который читает его впервые, пытаясь выяснить, что происходит. Поэтому вложенная функция IF, объединяющая ваши результаты, может выглядеть следующим образом:

=IF(AND(D11=D12,D11<>0),"Q",IF(OR(D11=-4,D12=4),"R",IF(AND(D11=4,D12=-4),"P",IF(D12=-4,"M",IF(D11=4,"A","I")))))

PROOF OF CONCEPT

Есть и другие варианты. которые могут использовать функции массива. И если у ваших данных было более 2-х вариантов (ФУНКЦИОНАЛЬНЫЕ / ДИСФУНКЦИОНАЛЬНЫЕ), то есть другие варианты размещения данных. Для превосходства я бы порекомендовал использовать таблицу для удобства чтения и сопровождения, но вам придется решить, что лучше всего подходит для вашей ситуации.

Настройте параметры ячеек и диапазонов в соответствии со своими потребностями.

Вариант 4

Используйте AGGREGATE, чтобы выполнить работу MATCH. Поскольку AGGREGATE возвращает номер столбца рабочего листа, его необходимо настроить на выбранный диапазон, вычитая номер строки / столбца заголовка. Без каких-либо дополнительных объяснений формула имеет вид:

=INDEX($D$4:$H$8,AGGREGATE(15,6,ROW($C$4:$C$8)/($C$4:$C$8=$D$12),1)-ROW($C$3),AGGREGATE(15,6,COLUMN($D$3:$H$3)/($D$3:$H$3=$D$11),1)-COLUMN($C$3))

11
задан iDev 21 August 2013 в 23:24
поделиться

3 ответа

Есть два разных способа сделать это, в зависимости от того, что вы ищете.

  • Блок END выполняется при выключении интерпретатора. Подробнее см. В предыдущем ответе :)
  • Блок / подпрограмма DESTROY , которая выполняется, когда ваш объект выходит за пределы области видимости. То есть, если вы хотите встроить свою логику в модуль или класс, вы можете использовать DESTROY .

Взгляните на следующий пример (это рабочий пример, но некоторые детали, такие как проверка ошибок и т. Д., Опущены):

#!/usr/bin/env perl

package File::Persistent;

use strict;
use warnings;
use File::Slurp;

sub new {
    my ($class, $opt) = @_;

    $opt ||= {};

    my $filename = $opt->{filename} || "./tmpfile";
    my $self = {
        _filename => $filename,
        _content => "",
    };

    # Read in existing content
    if (-s $filename) {
        $self->{_content} = File::Slurp::read_file($filename);
    }

    bless $self, $class;
}

sub filename {
    my ($self) = @_;
    return $self->{_filename};
}

sub write {
    my ($self, @lines) = @_;
    $self->{_content} .= join("\n", @lines);
    return;
}

sub DESTROY {
    my ($self) = @_;
    open my $file_handle, '>', $self->filename
        or die "Couldn't save persistent storage: $!";
    print $file_handle $self->{_content};
    close $file_handle;
}

# Your script starts here...
package main;

my $file = File::Persistent->new();

$file->write("Some content\n");

# Time passes...
$file->write("Something else\n");

# Time passes...
$file->write("I should be done now\n");

# File will be written to only here..
9
ответ дан 3 December 2019 в 01:38
поделиться

для обработки Ctrl-C, необходимо обработать сигналы (никакой блок КОНЦА не инициирован). Это могло быть сделано затем:

$SIG{INT}  = \&signal_handler;
$SIG{TERM} = \&signal_handler;

sub signal_handler {
    #implement here pre exit logic
    die "\n";
}
1
ответ дан 3 December 2019 в 01:38
поделиться

Думаю, вы ищете END блок :

END {
    # cleanup
}

Блок кода END выполняется как можно позже, то есть после завершения работы perl выполнение программы и непосредственно перед выходом из интерпретатора, даже если он завершается в результате выполнения функции die (). (Но не в том случае, если он трансформируется в другую программу через exec или вылетает из воды сигналом - вы должны поймать это самостоятельно (если можете).) У вас может быть несколько блоков END в файле - они будут выполнить в порядке, обратном определению; то есть: последний пришел, первый ушел (LIFO). Блоки END не выполняются при запуске perl с ключом -c или при сбое компиляции.

28
ответ дан 3 December 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: