Как я могу определить и удалить избыточный код в Perl?

Ну, читать это не сложно, просто используйте FileStream для чтения байта []. Преобразование его в текст на самом деле вообще невозможно или не имеет смысла, если только вы не конвертируете 1 и 0 в гекс. Это легко сделать с помощью перегрузки BitConverter.ToString (byte []). Как правило, вы хотите сбросить 16 или 32 байта в каждой строке. Вы можете использовать Encoding.ASCII.GetString (), чтобы попытаться преобразовать байты в символы. Пример программы, которая делает это:

using System;
using System.IO;
using System.Text;

class Program {
    static void Main(string[] args) {
        // Read the file into <bits>
        var fs = new FileStream(@"c:\temp\test.bin", FileMode.Open);
        var len = (int)fs.Length;
        var bits = new byte[len];
        fs.Read(bits, 0, len);
        // Dump 16 bytes per line
        for (int ix = 0; ix < len; ix += 16) {
            var cnt = Math.Min(16, len - ix);
            var line = new byte[cnt];
            Array.Copy(bits, ix, line, 0, cnt);
            // Write address + hex + ascii
            Console.Write("{0:X6}  ", ix);
            Console.Write(BitConverter.ToString(line));
            Console.Write("  ");
            // Convert non-ascii characters to .
            for (int jx = 0; jx < cnt; ++jx)
                if (line[jx] < 0x20 || line[jx] > 0x7f) line[jx] = (byte)'.';
            Console.WriteLine(Encoding.ASCII.GetString(line));
        }
        Console.ReadLine();
    }
}
7
задан brian d foy 1 November 2009 в 15:30
поделиться

4 ответа

Вы можете использовать модуль B :: Xref для создания отчетов с перекрестными ссылками.

10
ответ дан 6 December 2019 в 08:44
поделиться

Я сам сталкивался с этой проблемой в прошлом. Я собрал небольшую небольшую программу, которая использует PPI ​​для поиска подпрограмм. Он немного нормализует код (пробелы нормализованы, комментарии удалены) и сообщает о любых дубликатах. Работает достаточно хорошо. PPI делает всю тяжелую работу.

Вы можете сделать нормализацию немного умнее, нормализовав все имена переменных в каждой подпрограмме до $ a, $ b, $ c и, возможно, сделав что-то подобное для строк. Зависит от того, насколько агрессивным вы хотите быть.

#!perl

use strict;
use warnings;

use PPI;

my %Seen;

for my $file (@ARGV) {
    my $doc = PPI::Document->new($file);
    $doc->prune("PPI::Token::Comment");         # strip comments

    my $subs = $doc->find('PPI::Statement::Sub');
    for my $sub (@$subs) {
        my $code = $sub->block;
        $code =~ s/\s+/ /;                      # normalize whitespace
        next if $code =~ /^{\s*}$/;             # ignore empty routines

        if( $Seen{$code} ) {
            printf "%s in $file is a duplicate of $Seen{$code}\n", $sub->name;
        }
        else {
            $Seen{$code} = sprintf "%s in $file", $sub->name;
        }
    }
}
8
ответ дан 6 December 2019 в 08:44
поделиться

Это может быть неудобно, но лучший инструмент для этого - ваш мозг. Просмотрите весь код и поймите его взаимосвязь. Попробуйте увидеть общие закономерности. Затем выполните рефакторинг!

Я пометил ваш вопрос меткой « рефакторинг ». На этом сайте вы можете найти интересные материалы, относящиеся к этой теме.

3
ответ дан 6 December 2019 в 08:44
поделиться

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

Вот чрезмерно упрощенный пример:

grep -r "sub " codebase/* > function_list 

Таким же образом можно искать дубликаты. Эта идея может быть менее эффективной, если вы используете ООП Perl.

Также стоит упомянуть NaturalDocs , инструмент для документирования кода. Это поможет вам двигаться вперед.

0
ответ дан 6 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

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