Автор Тема: Въпрос относно open() на perl.  (Прочетена 2057 пъти)

saturn_vk

  • Напреднали
  • *****
  • Публикации: 215
    • Профил
Въпрос относно open() на perl.
« -: Mar 05, 2004, 16:27 »
Опитвам се да направя един скрипт да отвори даден файл, и като намери ред със определена начална дума на него, да отреже тази дума и да изпише всичко останало.

примерно, използвам думата thumb във скрипта и режа самата дума и празното място след нея.
Примерен код

#!/usr/bin/perl -w
my ($xdata) = @ARGV;
open(DAT,$xdata);
while (<DAT>) {
    my @xinfo = <DAT>;
    foreach (@xinfo) {
        if ($_ =~ /^thumb/) {
            my $xname = $_;
            $xname =~ s/^thumb\s//g;
            print "$xname";
        }          
    }              
}

проблема е, че като я насоча към файла, (направил съм един файл със няколко реда, единият от които започва със тази дума), скрипта стартира, но не изписва нищо(общо взето $xname като че ли си остава undef).

Някой знае ли къде греша?
Активен

"That is not dead which can eternal lie,
And with strange aeons even death may die."

pink

  • Напреднали
  • *****
  • Публикации: 94
    • Профил
    • WWW
Въпрос относно open() на perl.
« Отговор #1 -: Mar 05, 2004, 17:17 »
Дай примерния файл и командния ред, с който пускаш скрипта. Нещо не разбрах какво искаш да направиш.
Активен

mironcho

  • Напреднали
  • *****
  • Публикации: 495
    • Профил
Въпрос относно open() на perl.
« Отговор #2 -: Mar 05, 2004, 17:27 »
Може например така:
Примерен код

#!/usr/bin/perl
#
use warnings;
use strict;

if (open(FH, "< file")) {
        my @m = <FH>;
        close FH;

        foreach (@m) {
                if (s/^thumb\s//) {
                        print;
                }
        }
}



но ако искаш скрипта да върши само това, можеш да използваш grep/awk...



Активен

peio

  • Напреднали
  • *****
  • Публикации: 74
    • Профил
Въпрос относно open() на perl.
« Отговор #3 -: Mar 05, 2004, 20:32 »
perl си е тежка артилерия в повече от случаите, а grep, sed и awk се подценяват много.
ето ти пример за това, което искаш :
Примерен код
grep -w thumb file.txt | sed -e 's/thumb//'

може и да може да се направи само с grep като се ползват регулярните изрази, но и така става
Активен

mironcho

  • Напреднали
  • *****
  • Публикации: 495
    • Профил
Въпрос относно open() на perl.
« Отговор #4 -: Mar 05, 2004, 22:07 »
Иначе ето как можеш ад го направиш само със sed:
Примерен код

sed -r 's/(^thumb(.*))|(^.*)/\2/' file.txt


а за perl кода дето по горе ти го постнах - не обърнах внимание че взимаш файла като аргумент, така че може да се преправи скрипта така:
Примерен код

#!/usr/bin/perl
#
use warnings;
use strict;

die("Файла $ARGV[0] не съществува")  unless ( -e $ARGV[0]);
if (open(FH, "< $ARGV[0]")) {
       my @m = <FH>;
       close FH;

       foreach (@m) {
               if (s/^thumb\s//) {
                       print;
               }
       }
}
Активен

peio

  • Напреднали
  • *****
  • Публикации: 74
    • Профил
Въпрос относно open() на perl.
« Отговор #5 -: Mar 05, 2004, 22:15 »
и аз да не остана длъжен с едно по-лошо решение с awk само :
Примерен код
awk -F thumb '/thumb/{print $1,$2}' file.txt

но по-добре да се ползва това на mironcho
Активен

saturn_vk

  • Напреднали
  • *****
  • Публикации: 215
    • Профил
Въпрос относно open() на perl.
« Отговор #6 -: Mar 08, 2004, 23:04 »
грешката ми явно е била че затварям файла прекалено късно, или въобще не го затварям.

иначе мерси на mironcho че предостави тази алтернатива на скрипта.

обаче сега следва и нов въпрос за open() на perl.

Примерен код

...
        my $filehandle = $query->upload("upload");
        $dir = /някаква/директория;
        $filename = $query->param("upload");
...
        open( UPLOAD, "> $dir$filename" ) or print "Can't create $filename at $d
        binmode UPLOAD;
        while ( <$filehandle> ) {
            print UPLOAD;
        }
        close UPLOAD;
....


$filehandle е прихванато от upload на CGI. И според няколко man документа и редица текстове във мрежата, горният код би трябвало да е правилен(освен ако не съм пропуснал пак нещо). Файла се създава както си му е реда. Проблема е обаче, че си остава празен. А нямам и представа защо става така, няма никакви предупреждения когато се пуска скрипта.

Също много интересно е, че самият файл се създава само ако директорията е +х. Ако си е 666, а не 777, файла въобще няма да се създаде, и ще изписка че няма разрешение да го създаде.
Активен

"That is not dead which can eternal lie,
And with strange aeons even death may die."

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Cyr za Open Writer ot Open Office
Настройка на програми
line 3 5428 Последна публикация Sep 11, 2009, 23:50
от Odido
Perl
Общ форум
x11r6 5 3672 Последна публикация Aug 09, 2003, 10:03
от x11r6
Perl
Общ форум
Йордан 3 3100 Последна публикация Nov 13, 2003, 16:14
от Йордан
Gtk-Perl
Хардуерни и софтуерни проблеми
apogza 0 2001 Последна публикация Jan 24, 2004, 12:52
от apogza
Ползва ли се Perl в България и за какво?
Общ форум
berov 63 19531 Последна публикация Jan 31, 2005, 11:17
от toxigen