URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8624
[ Назад ]

Исходное сообщение
"perl и кавычки "

Отправлено L0n3R4ng3r , 13-Фев-10 23:07 
Доброго времени суток.

Столкнулся с такой проблемой, пытаюсь выкусить кусок из строки и вставить ее в переменую. Но перл вставляет лишний апостроф в переменую который не видный при ввыводе, но при операциях типа eq с аналогичным значением выдает false :(

вот вывод дебага:


monitoring::GetLogStringHash1(monitoring.pm:277):
277:            if ( $temp_hash->{type} eq "bin" or $temp_hash->{type} eq "char" ) {
  DB<1>
monitoring::GetLogStringHash1(monitoring.pm:278):
278:                my ($offset,$len);
  DB<1>
monitoring::GetLogStringHash1(monitoring.pm:279):
279:                if ($temp_hash->{value} =~ /(\d+)-(\d+)/){
  DB<1>
monitoring::GetLogStringHash1(monitoring.pm:280):
280:                    $offset = $1;
  DB<1>
monitoring::GetLogStringHash1(monitoring.pm:281):
281:                    $len = $2-$offset;
  DB<1>
monitoring::GetLogStringHash1(monitoring.pm:283):
283:                $result{$hashes} = substr($string,$offset,$len);
  DB<1>
monitoring::GetLogStringHash1(monitoring.pm:291):
291:        $deb = mon_debug::PrintPerfTime("GetLogStringHash",'end',$deb);
  DB<1> y temp_hash
%result = (
   'error_type' => 'I'
   'name' => 'JafCache                      '
)
  DB<2> y string
$string = 'JafCache                      :0705 232956.951:I:<CACHE>     :SETTER: Cache mbean max cached entries [5]'


'JafCache

аналогичные переменые выкусывает нормально, екранируя их '':
DB<1> y result string
$string = 'JafCache                      :0705 232956.951:I:<CACHE>     :SETTER: Cache mbean max cached entries [5]'
%result = (
   'error_type' => 'I'
)

перепробывал уже все и пытался удалять все ' в переменой и выкусывать не с нолевого а с первого символа. Как с этим бороться?

Заранее спасибо.


Содержание

Сообщения в этом обсуждении
"perl и кавычки "
Отправлено ACCA , 15-Фев-10 07:35 
[поток сознания поскипан]

Сделай короткий пример - данные, которые ты парсишь, минимальный кусок кода, который делает не то, что нужно и на словах скажи что ты хочешь получить. Например:

while (<DATA>) {
    chomp;
    my @a = split /\s*:\s*/;
    print join(',', @a);
}

__DATA__

JafCache :0705 232956.951:I:<CACHE>     :SETTER: Cache mbean max cached entries [5]


"perl и кавычки "
Отправлено L0n3R4ng3r , 15-Фев-10 13:55 
>[оверквотинг удален]
>
>while (<DATA>) {
>    chomp;
>    my @a = split /\s*:\s*/;
>    print join(',', @a);
>}
>
>__DATA__
>
>JafCache :0705 232956.951:I:<CACHE>     :SETTER: Cache mbean max cached entries [5]

вот код. посдний pring для того чтобы прогама сразу не закрылась в дебаге
#!/usr/local/bin/perl

my $str="JafCache                      :0705 232956.951:I:<CACHE>     :SETTER: Cache mbean max cached entries [5]";

my $offset=0;
my $len=30;
my $value=substr($str,$offset,$len);
print "$value\n";
print "false" if ($value ne 'JafCache');
print "df";


вот дебаг:
main::(qwe:3):  my $str="JafCache                      :0705 232956.951:I:<CACHE>     :SETTER: Cache mbean max cached entries [5]";
  DB<1> n
main::(qwe:5):  my $offset=0;
  DB<1>
main::(qwe:6):  my $len=30;
  DB<1>
main::(qwe:7):  my $value=substr($str,$offset,$len);
  DB<1>
вот принт на аутпуте у нас JafCache:
main::(qwe:8):  print "$value\n";
  DB<1>
JafCache
main::(qwe:9):  print "false" if ($value ne 'JafCache');
смотрим что у нас внутри переменой:
  DB<1> y value
$value = 'JafCache                      '
вот такое
  DB<2>
main::(qwe:10): print "df";
  DB<2> false

собственно пока писал и нашел ошибку которую не мог долго заметить - в переменое еще куча пробелов в конце :)
$value =~ s/\s//g;
все