Почему эта предполагаемая интерполяция интерпретируется как деление на Perl? - PullRequest
4 голосов
/ 11 июня 2009

G'day,

Почему я получаю следующие две ошибки из фрагмента скрипта ниже?

Аргумент "www4.mh.xxxx.co.uk.logstatsto20090610.gz" не является числовым в делении (/) в строке 56

Аргумент "/logs/xxxx/200906/mcs0.telhc/borg2" не является числовым в делении (/) в строке 56

Переменные $ dir и $ log являются строками, а конкатенация двух строк вместе с косой чертой в середине также заключена в кавычки.

        foreach my $dir (@log_dirs) {
            foreach my $log (@log_list) {
line 56:        if ( -s "$dir/$log" ) {
                    push(@logs, $dir/$log);
                }
            }
        }

Редактировать: Строка 56, безусловно, является оператором if. Тем не менее, Пол, вы правы, решение этой проблемы заключено в кавычки в строке 57 . Благодаря.

Редактировать: Строка 56, сообщающая о версии Perl, равна

stats@fs1:/var/tmp/robertw> /usr/local/perl/bin/perl -v      

This is perl, v5.6.1 built for sun4-solaris

Copyright 1987-2001, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'.  If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.

stats@fs1:/var/tmp/robertw> 

Редактировать: Несмотря на использование метода интерполированных строк в Perl, учитывая, что переменные сами являются строками, и я пытаюсь объединить их вместе с символом косой черты, не является ли конкатенация строк с чистым результатом?

ура

Ответы [ 4 ]

12 голосов
/ 11 июня 2009

Строка 56 - это, вероятно, строка после нее, где вы делаете попытку разделить две строки. То, что вы, вероятно, намеревались было

   foreach my $dir (@log_dirs) {
        foreach my $log (@log_list) {
            if ( -s "$dir/$log" ) {
                push(@logs, "$dir/$log");
            }
        }
    }
9 голосов
/ 11 июня 2009

Вы не цитируете строку в вашем push . Вместо того, чтобы создавать пути самостоятельно, попробуйте выработать переносимые пути с помощью File :: Spec :

use File::Spec::Functions;

my $path = catfile( $dir, $file );

Затем вы используете $path всякий раз, когда хотите эту строку, чтобы у вас не было повторения, переделав строку снова (и, возможно, в следующий раз сделав это неправильно;).

5 голосов
/ 11 июня 2009

Это вызвано следующей строкой:

push(@logs, $dir/$log);

У вас там есть дивизия.

2 голосов
/ 11 июня 2009

Мне интересно узнать, какую версию Perl вы используете? Все, что я могу легко попробовать, правильно сообщают номер строки push.

...