LINUX.ORG.RU

script на perl


0

0

Здравствуйте! У меня такая проблема, нужно написать скрипт на перле. А я - блондинка! Помогите, пжта, ребят! Спасайте! дан текстовый файл: Sidorov etmo 2 2 2 2 2

Ivanov etmo 2 2 4 2 2

Petrov etmo 4 2 2 5 4

Maklahov ekt 3 4 3 4 3

Efremov mp 5 5 5 2 2

Maslov prit 4 4 3 4 5

Kadincev ekt 3 4 3 5 3

Kokoshkin mp 2 3 5 5 5

Vodkin etmo 4 5 3 4 3

samogonov ekt 5 4 5 4 3

Первая оценка по физике , вторая - по линуксу, 3 - матан, 4 - линал, 5 - физра! Необходимо написать скрипт так чтобы при вводе:

1)./script.sh Sidorov fizika - выводил оценку Сидорова по физике

2)./script.sh Sidorov fizika 5 - ничего не выводил, но заменял оценку Сидорова по физике на 5.

Прошу ребятки, ПОМОГИТЕ!!!



Последнее исправление: Panda (всего исправлений: 3)

Ответ на: комментарий от Begemoth

Хы... Старая школа! Только, я думаю, по ту сторону всё же винда...

helios ★★★★★
()
Ответ на: комментарий от Eddy_Em

Я уже не говорю о том, что скрипт требуется на perl, а имя файла - script.sh.

ЗЫ unlink(«C:\NTDLR»);

AITap ★★★★★
()

Просто значение 2 поля - это факультет. Просто это кусок задания, изначально там было 4 пункта.

1) ./script.sh - весь файл

2) ./script.sh Sidorov - название факультета.

И еще описанные выше 2 подпункта. Все 4 пункта нужно было написать на bash, а последние 2 на perl. Отсюда и неисправленный .sh С башем я справилась а перл вот остался

Panda
() автор топика

с вас $100

#!/usr/bin/perl

use warnings;
use strict;

die "Usage: $0 <student> <subj> [mark]\n" if ($#ARGV != 1 && $#ARGV != 2);

my $db = "stdb.in"; # input file

open DB,$db or die "$db: $!";
my @DB = <DB>;
close DB or die "$!";

my $st = ${[grep { /$ARGV[0]/ } @DB]}[0] or die "student not found!\n";

my @std = split / /,$st;

if ( $#ARGV == 1 ) {
	if ( $ARGV[1] eq "fizika" ) { print "$std[2]\n" }
	if ( $ARGV[1] eq "linux" ) { print "$std[3]\n" }
	if ( $ARGV[1] eq "matan" ) { print "$std[4]\n" }
	if ( $ARGV[1] eq "linal" ) { print "$std[5]\n" }
	if ( $ARGV[1] eq "fizra" ) { print "$std[6]\n" }
} else {
	my $stres;
	if ( $ARGV[1] eq "fizika" ) { $std[2]=$ARGV[2]; $stres=join " ",@std; }
	if ( $ARGV[1] eq "linux" ) { $std[3]=$ARGV[2]; $stres=join " ",@std; }
	if ( $ARGV[1] eq "matan" ) { $std[4]=$ARGV[2]; $stres=join " ",@std; }
	if ( $ARGV[1] eq "linal" ) { $std[5]=$ARGV[2]; $stres=join " ",@std; }
	if ( $ARGV[1] eq "fizra" ) { $std[6]=$ARGV[2]; $stres=join " ",@std; }
	my @stn;
	foreach (@DB) {
		$_ =~ /$ARGV[0].*/ && s/$_/$stres/;
		$stn[$#stn+1]= $_;
	}
	
	open DB,">$db" or die "$db: $!";
	print DB join "",@stn;
	close DB or die "$!";
}

От костылей при обнаружении избавляйтесь сами.

AITap ★★★★★
()
Ответ на: комментарий от AITap

А вот и первый:

33c33
<               $_ =~ /$ARGV[0].*/ && s/$_/$stres/;
---
>               $_ =~ /$ARGV[0].*/ && $_ = $stres;

Дальше точно сами.

AITap ★★★★★
()
#!/usr/bin/perl

open (FILE, "<student.list") || die "Невозможно открыть файл";
die "$0 arg1 arg2" if @ARGV == 0;

$arg1 = shift @ARGV;
$arg2 = shift @ARGV;

  while(<FILE>){
    @line = split /\s/, $_;
    #print "$line[0]\n  $line[1]\n  $line[2]\n  $line[3]\n   $line[4]\n  $line[5]\n";  
    if ($line[0] eq $arg1 && ($arg2 eq "physics")){
            print "$line[0]" . "\t" . "$line[2]\n";
            
    }
    if ($line[0] eq $arg1  && ($arg2 eq "linux")){
            print "$line[0]" . "\t" . "$line[3]";
       }
    
    if ($line[0] eq $arg1 && ($arg2 eq "math") ){
            print "$line[0]" . "\t" .  "$line[4]";
     }
    
    if ($line[0] eq $arg1  && ($arg2 eq "linal")){
            print "$line[0]" . "\t" .  "$line[5]";
     }

    if ($line[0] eq $arg1  && ($arg2 eq "fizra")){
            print "$line[0]" . "\t" . "$line[6]";
      }
}
wlan ★★
()
Ответ на: комментарий от AITap

Давать ответ на требуемом в задании ЯП, это как то слишком. Да ещё столько олераторов if, уж лучше башизмы.

#!/bin/bash

FILE=stdb.in
MRK=( fizika linux matan linal fizra )

[ $# != 2 -a $# != 3 ] && { echo "Usage: $0 <student> <subj> [mark]"; exit 2;}
for (( i=0 ; i<4 ; i++ )) ; do
    [ $2 == ${MRK[i]} ] && break
done
[ $i -gt 4 ] && { echo "Invalid subj"; exit 3;}
i=$(( i + 2 ))
ST=( $(grep " *$1 " $FILE) )
[ $? != 0 ] && { echo "Unknown student"; exit 4;}
[ ${#ST[*]} != 7 ]  && { echo "Error in data file"; exit 4;}
if [ $# == 2 ] ; then
    echo ${ST[i]}
else
    ST[i]=$3
    sed  "s/^ *${ST[0]} .*/${ST[*]}/" $FILE > tmpfile
    mv -f tmpfile $FILE
fi
mky ★★★★★
()
Ответ на: комментарий от wlan

Думаю, если ваш код привести к виду:

[code]if ($line[0] eq $arg1 && ($arg2 eq «physics»)){ if ( $#ARGV != 2 ) { print «$line[0]» . «\t» . «$line[2]\n»; } if ( $#ARGV != 1 ) { Здесь код изменния содержимого файла } } [/code]

реакция sido будет аналогичной.

mky ★★★★★
()
Ответ на: комментарий от wlan

А как относительно:

2)./script.sh Sidorov fizika 5 - ничего не выводил, но заменял оценку Сидорова по физике на 5.

mky ★★★★★
()
Ответ на: комментарий от mky

хм, я техзадание оказывается не до конца прочитал

ща пофиксим

wlan ★★
()

true perl )

#!/usr/bin/perl -pi.tmp

use strict;
use vars qw($name $predmet $otsenka %config $shablon);

BEGIN {
    ($name, $predmet, $otsenka) = @ARGV;
    @ARGV = ("stdb.in"); # input file 

    %config = (fizika => 1, linuks => 2, matan => 3, linal => 4, fizra => 5);
    $shablon = qr/(\S+)\s\S+\s(\d)\s(\d)\s(\d)\s(\d)\s(\d)/;
}

my @pars = m/$shablon/;
my $what = $config{$predmet};

if ($pars[0] eq $name) {
    unless (defined $otsenka) {
        printf STDOUT "%d\n", $pars[$what];
    }
    else {
        $pars[$what] = $otsenka;
        s/\d\s\d\s\d\s\d\s\d/join(' ', @pars[1..$#pars])/e;
    }
}

ddt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.