從目錄中檢索最新數據
我想從此
data.list
目錄中檢索行數:Project/chris/company/Delta/force/run_20210619_df/total/data.list
但問題是run_20210619_df
每次將新數據更新到 data.list 時都會發生更改並被替換。假設原始目錄是:
Project/chris/company/Delta/force/run_20210619_df/total/data.list
但是今天
data.list
正在更新,因此在run_20210619_df
仍然存在的同時形成了一個新目錄:Project/chris/company/Delta/force/run_20210624_df/total/data.list
並且目錄都包含
data.list
我可以製作一個始終可以閱讀最新版本的 腳本
data.list
嗎?在這種情況下,它的內部run_20210624_df
我從這個開始:
use strict; use warnings; use feature 'say'; use Data::Dumper; my $files = './Project/chris/company/Delta/force/*/total/data.list'; my $hashref; for my $file ( glob($files) ) { my($date) = (split('/',$_))[6]; if( $hashref->{$id) and $date gt $hashref->{$id}{date} ) { $hashref->{$id}{file} = $file; $hashref->{$id}{date} = $date; $hashref->{$id}{count} = count_lines($file); } else { $hashref->{$id}{file} = $file; $hashref->{$id}{date} = $date; $hashref->{$id}{count} = count_lines($file); } } say Dumper($hashref); sub count_lines { my $fname = shift; my $count; open my $fh, '<', $fname or die $!; $count++ while <$fh>; close $fh; return $count; }
不幸的是,當我執行腳本時,它無法檢測到從哪個 data.list 中提取資訊。並因此列印 3 次,因為我有 3 個不同的 $date 文件
stat
使用該函式按每個文件的修改時間戳對 glob 進行排序。例如
代替:
for my $file ( glob($files) ) {
利用:
for my $file ( sort { (stat $b)[9] <=> (stat $a)[9] } glob($files) ) {
這將以相反的時間戳順序排序,即第一個元素將是最新的。
您可能不想遍歷與 glob 匹配的整個文件列表,只需使用最新的:
#!/usr/bin/perl use strict; use warnings; use feature 'say'; my $glob_pattern = './Project/chris/company/Delta/force/*/total/data.list'; my @files = ( sort { (stat $b)[9] <=> (stat $a)[9] } glob($glob_pattern) ); my $file = $files[0]; printf "%s: %i\n", $file, count_lines($file); sub count_lines { ... ... ... }
為什麼
(stat $b)[9]
和(stat $a)[9]
?因為修改時間是函式返回的13個元素列表的第9個元素stat
。它通常像這樣使用:my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
atime
,mtime
, 都是ctime
數值,自紀元以來的秒數(格林威治標準時間 1970 年 1 月 1 日午夜) - 即標準 unix time_t 值。因為它們是數字的,所以可以像任何其他數值一樣對它們進行排序、比較、添加、減去等。有關
perldoc -f stat
stat 函式的更多詳細資訊,請參閱。
perldoc -f sort
有關該sort
功能的詳細資訊,另請參閱。在上面的程式碼中,它使用一個程式碼塊來根據從文件名(即它們的 mtimes)派生的值進行排序,而不是根據文件名本身進行排序。順便說一句,請記住 perl 數組從 0 開始,而不是 1。所以
$$ 9 $$是第十個元素,從零開始。還,$$ 6 $$是第七個元素,所以你
(split('/',$_))[6]
可能應該是[5]
而不是[6]
. 現在不需要,因為上面的程式碼使用文件的實際時間戳。