Команда Perl bash в цикле while создает бессмыслицу - PullRequest
0 голосов
/ 22 февраля 2012

Привет, стэкпопперы!

У меня есть две вещи, которые нужно решить и отобразить результаты онлайн в cgi-файле.

A) получить все следующие имена на заданном пути

B) определить возраст index.html внутри каждой папки

результат должен выглядеть следующим образом:

[номер] [имя_фолдера] [fileage]

Эта cgi-страница работает на сервере Solaris с установленным Perl 5.8.4

Мое решение - это комбинация bash и perl. Для решения проблемы A) (имена папок) я написал скрипт bash:

#!/bin/bash
#
find /test/ -type d | sed -e 's/^.*\///'

Это дает мне хороший список всех foldernames в / test /

Теперь Perl-код для отображения этого вывода в браузере:

  #Establish a pipeline between the bash and my script.
  my $bash_command = '/test./foldernames.bash';
  open(my $pipe, '-|', $bash_command) or die "Can't open pipe: $!";
  # initialize variables
   my $foldername = "";
   my $i    = 0;

  # Process the output from bash command line by line.
  while (my $line = <$pipe>)
  {
   $foldername = $line;
   $i = $i+1;

   print"  <tr><td>$i</td><td>$foldername</td></tr>";
 }#end while

Это работает! Я получу хороший стол с [Number] и [Foldername]! Теперь самое сложное! Кроме того, я хочу, чтобы дата index.html находилась в каждой папке. Поэтому у меня есть другой скрипт bash:

ls -ltr /test/folder1/*.html | tail -1 | awk '{printf"%3s %1s %s\n",$6, $7, $8}`

Это дает мне идеальный вывод: 22 февраля 10: 56 Теперь мне нужна эта информация в моей таблице. Я добавил эту строку в свой Perl-скрипт в цикле while:

$timestamp = `ls -ltr /test/folder1/*.html | tail -1 | awk '{printf"%3s %1s %s\\n",\$6, \$7, \$8}`;

Это прекрасно работает, когда я добавляю имя в виде строки. Как только я обменяю folder1 на $ foldername , я получу бессмысленную информацию "ls".

Почему это так?

Редактировать: Теперь я использовал:

use File::stat;
use Time::localtime;
my $timestamp = ctime(stat("/test/folder1")->mtime);

Это намного более безопасно по сравнению с анализом вывода ls. Но все же у меня есть проблемы с $ foldername. Я использовал функцию length , чтобы определить длину $ Foldername .

$ foldername имеет длину 7, но вывод строки имеет только 6 символов: помидор

Итак, я попробовал Chop / chomp $ foldername с всегда одинаковым результатом: 7 символов!

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

Во-первых, не анализировать ls программно выводить . Это почти гарантированно сломать в какой-то момент, и сделать это каким-то захватывающим образом. Анализ выходных данных find только немного безопаснее (например, имена каталогов в большинстве Unix-систем могут содержать символы новой строки; я не вижу, чтобы ваш код хорошо справлялся с такой возможностью).

Perl имеет функцию stat , которая даст вам дату и время любого файла или каталога (atime, mtime или ctime, если доступно), а также кучу другой информации. Затем вы можете использовать что-то вроде strftime, чтобы отформатировать эти временные метки для лучшего вывода.

2 голосов
/ 22 февраля 2012

Я полагаю, вы получите другой вывод, потому что $foldername не содержит "folder1".

На самом деле, глядя на ваш предыдущий код, отсутствие chomp ing указывает на то, что $foldername с гораздо большей вероятностью будет содержать "folder1\n".

Обратите внимание, что ваш подход потерпит неудачу, если $foldername содержит пробел, что является довольно глупым ограничением в наши дни. Проверьте stat или Файл :: stat .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...