LINUX.ORG.RU

Начинаю учить Perl

 , ,


0

1

Есть БД, в ней таблица состоящая из трех столбцов: id, pnames, points.

+----+---------+--------+
| id | pnames  | points |
+----+---------+--------+
|  1 | Ivanov  |     90 |
|  2 | Petrov  |    190 |
|  3 | Sidorov |    110 |
|  4 | Sokolov |     70 |
+----+---------+--------+

Задача состоит в том, чтобы вывести в текстовый файл записи у которых points>100. Вот решение:

#!/usr/bin/perl
use DBI;
my $filename = 'test.txt';
$host = "localhost";
$database = "mybase";
$user = "myuser";
$password = "myuser";
$dsn = "DBI:mysql:database=$database;host=$host;port=3306";
$dbh = DBI->connect($dsn, $user, $password);
$sth = $dbh->prepare("select * from players where points>100"); 
$sth->execute;
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
while ($ref = $sth->fetchrow_arrayref) {
print $fh "$$ref[0]\t$$ref[1]\t$$ref[2]\n";
}
close $fh; 
$rc = $sth->finish;     
$rc = $dbh->disconnect;
Правильно, что пишу в файл:
print $fh "$$ref[0]\t$$ref[1]\t$$ref[2]\n";
или лучше иным образом производить запись запроса в файл?

★★★★★

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

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

скажите, а если я обзову переменные, так, к примеру, и буду их использовать, для большей наглядности

$id=$ref[0];$pname=$ref[1];$points=$ref[2];
print $fh "$$id\t$$pname\t$$points\n";
будет правильно?

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

ИМХО, не читабельно, но так тоже можно. ЕМНИП, там был метод который возвращает hash табличку, и тогда у тебя будет что-то вроде:

$VAR1 = {
    id => 1,
    pnames => "la-la",
    points => 333,
}
С этим потом работать гораздо удобней.

joy4eg ★★★★★
()
while ($ref = $sth->fetchrow_arrayref) {
  print $fh "$$ref[0]\t$$ref[1]\t$$ref[2]\n";
}

Можешь заменить на:

while (my @arr = $sth->fetchrow_array) {
  say $fh join "\t",@arr;
}

Или на такое:

while (my $ref = $sth->fetchrow_hashref) {
  say $fh join "\t",$ref->{id},$ref->{pnames},$ref->{points};
}

disarmer ★★★
()

Работает, задачу выполняет. И на том спасибо, но от меня:

  • my $filename = 'test.txt';
    $host = "localhost";
    
    ....
    open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
    

    Либо используем strict (common::sense), либо нет. Воспринимаю и то, и другое, но исключительно в раздельном виде.

  • $sth = $dbh->prepare("select * from players where points>100"); 
    $sth->execute;
    
    Заменить на
    $sth = $dbh->prepare("select * from players where points>?"); 
    $sth->execute(100);
    
  • printf $fh "%s\t%s\t%s\n", $$ref[0], $$ref[1], $$ref[2];
    
    Длиньше, но переменки и формат строки видно нормально
animechaos
()
Ответ на: комментарий от generator

А ты сам то еще жив? Может твой мозг уже умер и это последние нейроны тебя вводят в заблуждение, что ты читаешь лор

anonymous
()

Почему my только для $filename и где use strict?

print $fh join "\t", @$ref;

ну ньюлайн сам добавь, или say, хотя нет , лучше добавь сам )))

chg ★★★★★
()
Последнее исправление: chg (всего исправлений: 1)
Ответ на: комментарий от int13h

будет глупо. чтобы стало правильно, добавь стрелку после ссылки

а лучше используй константы-индексы

chg ★★★★★
()

Упражнение кто как извернётся на простом задании?

$fh->print(join "\n", 
    map {join "\t", @$_} 
    @{$dbh->selectall_arrayref(
         "select * from players where points > ?", undef, 100)}
);

pef-secure
()
Ответ на: комментарий от int13h

скажите, а если я обзову переменные, так, к примеру, и буду их использовать, для большей наглядности

наглядно можно. твой вариант жутковат. fetchrow_hashref уже показали, можно выбирать все разом в массив хешей через

$dbh->selectall_arrayref($query, {Slice => {}}, @params)
лично мне так часто удобнее. потом всё равно в json пихать.

pef-secure
()
Ответ на: комментарий от pef-secure

А как в перл выглядит компайл-тайм? Я просто не в курсе. Вот в питоне из исходника создается байткод, а в перл? Не слышал про перловый байткод. В питоне имена переменных ссылки, без рантайма не определишь, опечатка ли или нет. С другой стороны, могли бы написать кодек, который проверял опечатки. Что-то вроде:

# coding: strict

Почему-то не нужно.

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

всякие чекеры кода умеют. не то, чтобы они тебе сказали, что мол вот, чувак, ты ошибся, но что-то типа «unknown variable» или «assigned but never used» высрут. тем более, что к виму отличну прикручиваются.

foreigner_web
()
Ответ на: комментарий от Virtuos86

Почему-то не нужно.

Весь мир из компромиссов. В питоне выбрали свой набор.

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