Как исправить ошибку многострочной убегающей строки в Perl? - PullRequest
1 голос
/ 02 марта 2009

В моем скрипте Perl есть ошибки, я посмотрел исходный код, но не смог найти проблему.

#Tool: decoding shell codes/making shell codes

use strict;
use Getopt::Std;

my %opts=();
getopts("f:xa", \%opts);

my($infile, $hex);
my($gen_hex, $gen_ascii);

sub usage() {
print "$0 -f <file> [-x | -a] \n\t";
print '-p <path to input file>'."\n\t";
print '-x convert "\nxXX" hex to readable ascii'."\n\t";
print '-a convert ascii to "\xXX" hex'."\n\t";
print "\n";
exit;
}

$infile = $opts{f};

$gen_hex = $opts{a};
$gen_ascii = $opts{x};use


if((!opts{f} || (!$gen_hex && !$gen_ascii)) {
usage();
exit;
}

if($infile) {
open(INFILE,$infile) || die "Error Opening '$infile': $!\n"; 
while(<INFILE>) {
#Strips newlines
s/\n/g;
#Strips tabs
s/\t//g;
#Strips quotes
s/"//g;
$hex .= $_;
}
}

if($gen_ascii) {

# \xXX hex style to ASCII
$hex =~ s/\\x([a-fA-F0-9]{2,2})/chr(hex($1)/eg;
}
elsif ($gen_hex) {
$hex =~ s/([\W|\w)/"\\x" . uc(sprintf("%2.2x",ord($1)))/eg;
} 

print "\n$hex\n";
if($infile) {
close(INFILE);
}

дает мне ошибки

Backslash found where operator expected at 2.txt line 36, near "s/\"
(Might be runaway multi-line // string starting on line 34) 
syntax error at 2.txt line 25, near ") {"
syntax error at 2.txt line 28, near "}"
syntax error at 2.txt line 36, near "s/\"
syntax error at 2.txt line 41. nar "}"
Execution of 2.txt aborted due to compilation errors

Вы видите проблемы?

Ответы [ 4 ]

15 голосов
/ 02 марта 2009
#Strips newlines
s/\n/g;

Это неправильно. Вы забыли дополнительный /:

#Strips newlines
s/\n//g;

Кроме того, здесь слишком мало скобок:

if((!opts{f} || (!$gen_hex && !$gen_ascii)) {

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

В качестве примечания, попробуйте use warnings;, когда это возможно. Это хорошая вещь ™.

РЕДАКТИРОВАТЬ: Пока я в этом, вы можете быть осторожны с вашими open() s:

open(INPUT,$input);

можно злоупотреблять. Что если $input равно ">file.txt"? Затем open() попытается открыть файл для записи - не то, что вы хотите. Попробуйте вместо этого:

open(INPUT, "<", $input);
5 голосов
/ 02 марта 2009

Есть много ошибок: завершающий use, пропущенный / в s операторе, несбалансированные скобки в if выражении. Немного убираюсь:

use strict;
use Getopt::Std;

my %opts = ();
getopts( "f:xa", \%opts );

my ( $gen_hex, $gen_ascii );

sub usage() {
    print <<EOU
$0 -f <file> [-x | -a]
    -p <path to input file>
    -x convert "\\xXX" hex to readable ascii
    -a convert ascii to "\\xXX" hex
EOU
}

@ARGV = ( $opts{f} ) if exists $opts{f};

$gen_hex   = $opts{a};
$gen_ascii = $opts{x};

if ( not( $gen_hex xor $gen_ascii ) ) {
    usage();
    exit;
}

my $transform = $gen_ascii
    ? sub {
    s/\\x([a-fA-F0-9]{2,2})/pack'H2', $1/eg;
    }
    : sub {
    s/([^[:print:]])/'\\x'.uc unpack'H2', $1/eg;
    };

while (<>) {
    s/\n    #Strips newlines
    | \t    #Strips tabs
    | "     #Strips quotes
    //xg;
    &$transform;
    print;
}
1 голос
/ 02 марта 2009
line25: if((!opts{f} || (!$gen_hex && !$gen_ascii)) {
line26: usage();

Это $ opts {f}

0 голосов
/ 02 марта 2009

На самом деле, я думаю, что ошибка здесь:

s/"//g;

Двойные кавычки следует экранировать, чтобы строка стала:

s/\"//g;

Вы можете заметить, что это строка, в которой подсветка синтаксиса идет неправильно на SO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...