while循环中的Perl bash命令会产生无意义的结果

while循环中的Perl bash命令会产生无意义的结果,perl,while-loop,Perl,While Loop,大家好 我有两件事要解决,并在cgi文件中在线显示结果 A)获取给定路径上的所有文件夹名称 B)确定每个文件夹中index.html的使用期限 结果应该如下所示: [编号][Foldername][fileage] 此cgi页面在安装了perl 5.8.4的solaris服务器上运行 我的解决方案是bash和perl的组合。为了解决问题A)(文件夹名称),我编写了一个bash脚本: #!/bin/bash # find /test/ -type d | sed -e 's/^.*\///' l

大家好

我有两件事要解决,并在cgi文件中在线显示结果

A)获取给定路径上的所有文件夹名称

B)确定每个文件夹中index.html的使用期限

结果应该如下所示:

[编号][Foldername][fileage]

此cgi页面在安装了perl 5.8.4的solaris服务器上运行

我的解决方案是bash和perl的组合。为了解决问题A)(文件夹名称),我编写了一个bash脚本:

#!/bin/bash
#
find /test/ -type d | sed -e 's/^.*\///'
ls -ltr /test/folder1/*.html | tail -1 | awk '{printf"%3s %1s %s\n",$6, $7, $8}`
这给了我一个很好的列表,列出了/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
这给了我一个完美的输出:2月22日10:56现在我需要表格中的这些信息。我在while循环中的perl脚本中添加了这一行:

$timestamp = `ls -ltr /test/folder1/*.html | tail -1 | awk '{printf"%3s %1s %s\\n",\$6, \$7, \$8}`;
当我将foldername添加为字符串时,这非常有效。只要我用$foldername交换folder1,我就会得到无意义的“ls”信息

为什么会这样

编辑:现在我使用了:

use File::stat;
use Time::localtime;
my $timestamp = ctime(stat("/test/folder1")->mtime);
与解析ls输出相比,这更安全。但我仍然对$foldername有问题。我使用了length函数来确定$Foldername的长度

$foldername的长度为7,但字符串输出只有6个字符:番茄


因此,我尝试切碎/咀嚼$foldername,结果总是一样的:7个字符

我假定您得到不同的输出,因为
$foldername
不包含
“folder1”

事实上,查看您以前的代码,如果缺少ing,则表明
$foldername
更可能包含
“folder1\n”


请注意,如果
$foldername
包含一个空格,您的方法将失败,这在当今是一个相当愚蠢的限制。签出或。

我想您会得到不同的输出,因为
$foldername
不包含
“folder1”

事实上,查看您以前的代码,如果缺少ing,则表明
$foldername
更可能包含
“folder1\n”


请注意,如果
$foldername
包含一个空格,您的方法将失败,这在当今是一个相当愚蠢的限制。签出或。

首先,不要以编程方式解析
ls
输出。它几乎肯定会在某个时刻断裂,并且以某种壮观的方式断裂。解析
find
的输出只稍微安全一点(例如,大多数unix上的目录名可能包含换行符;我不认为您的代码能够很好地处理这种可能性)


Perl提供了一个可以为您提供任何文件或目录(atime、mtime或ctime,如果可用)的日期和时间,以及一系列其他信息。然后,您可以使用类似的方法格式化这些时间戳以获得更好的输出。

首先,不要以编程方式解析
ls
输出。它几乎肯定会在某个时刻断裂,并且以某种壮观的方式断裂。解析
find
的输出只稍微安全一点(例如,大多数unix上的目录名可能包含换行符;我不认为您的代码能够很好地处理这种可能性)


Perl提供了一个可以为您提供任何文件或目录(atime、mtime或ctime,如果可用)的日期和时间,以及一系列其他信息。然后,您可以使用类似的方法格式化这些时间戳,以获得更好的输出。

使用File::stat;使用时间::localtime;my$timestamp=ctime(stat(“/test/folder1”)->mtime);与解析ls输出相比,这更安全。但我仍然对$foldername有问题。我使用了length函数来确定$Foldername的长度$foldername的长度为7,但字符串输出只有6个字符:tomato,因此我尝试切碎/咀嚼$foldername,结果总是一样的:7个字符!使用File::stat;使用时间::localtime;my$timestamp=ctime(stat(“/test/folder1”)->mtime);与解析ls输出相比,这更安全。但我仍然对$foldername有问题。我使用了length函数来确定$Foldername的长度$foldername的长度为7,但字符串输出只有6个字符:tomato,因此我尝试切碎/咀嚼$foldername,结果总是一样的:7个字符!