Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: saturn_vk в Mar 05, 2004, 16:27



Титла: Въпрос относно open() на perl.
Публикувано от: saturn_vk в 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).

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


Титла: Въпрос относно open() на perl.
Публикувано от: pink в Mar 05, 2004, 17:17
Дай примерния файл и командния ред, с който пускаш скрипта. Нещо не разбрах какво искаш да направиш.


Титла: Въпрос относно open() на perl.
Публикувано от: mironcho в 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...





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

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


Титла: Въпрос относно open() на perl.
Публикувано от: mironcho в 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;
               }
       }
}


Титла: Въпрос относно open() на perl.
Публикувано от: peio в Mar 05, 2004, 22:15
и аз да не остана длъжен с едно по-лошо решение с awk само :
Примерен код
awk -F thumb '/thumb/{print $1,$2}' file.txt

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


Титла: Въпрос относно open() на perl.
Публикувано от: saturn_vk в 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, файла въобще няма да се създаде, и ще изписка че няма разрешение да го създаде.