«Я переписываю скрипт Bash в Perl, чтобы узнать последнее».
Я думаю, что вы используете неправильный подход к изучению Perl или изучению любого языка.
Несмотря на то, что между процедурными языками всегда много общего, всегда неправильно фокусироваться на тех, которые выше различий. Языки программирования должны изучаться с нуля, если вы надеетесь когда-либо читать и писать их хорошо.
Я регулярно вижу код Perl в переполнении стека, который явно написан кем-то с неправильной головкой. Например, отчетливые признаки C программиста являются
Декларирование все в одном блоке в верхней части исходного файла
Чрезмерная использования scalar
и круглые скобки
Под -использование переменной по умолчанию$_
и регулярные выражения
Используя цикл C-стиль for
, который обычно выглядит примерно так в Perl
my $i;
for ($i=0; $i<=scalar(@data); $i++)
{
process($data[$i])
}
Помимо игнорирования perlstyle
полностью, автор хватается за что-то знакомое, вместо того, чтобы охватить новый язык.В идиоматических Perl, который должен выглядеть
process($_) for @data
Достигнув дальше, легко почивать на лаврах о последствиях фраз вы можете писать многословно в оболочке
Вы должны знать, что ваш заявление оболочки
ls |grep $customDate
начинает новые процессы для запуска /bin/ls
и /bin/grep
, и обжигающе информацией между ними и обратно в с адский процесс. Linux оболочка и ее вспомогательные утилиты предназначены, чтобы получить тривиальные работы легко сделать, но я считаю, что они используют слишком много со сложным сценарием оболочки однострочечников, которые являются непрозрачными и за отладку
это очень трудно точно сказать, что это то, что вам нужна ваша программа, чтобы сделать, но это выглядит, как вы хотите узнать, есть ли какие-либо файлы, которые содержат строку как 2016_05May_30Mon
в текущем каталоге
Я должен сказать, это ужасный формат даты и времени, и я изо всех сил верить, что это то, что вы хотите, но я бы предпочел основной Time::Piece
модуль Perl над POSIX
в любое время
В этом случае я бы также использовать О.Д. регулярных выражений Perl, тем -X
* файловые испытательные операторы и оператор glob
Perl вместо opendir
, readdir
, closedir
. Ни один из них не имеет прямой эквивалент в любом языке оболочки
Таким образом, если предположить, что мои догадки о своем намерении правильно, я бы написал этот
use strict;
use warnings 'all';
use feature 'say';
use Time::Piece;
my $dtime = localtime()->strftime('%Y_%m%b_%d%a');
say for grep { -f and /$dtime/ } glob '*.txt';
который не отдаленно, как ваш перевод с оболочки на Perl
, похоже, работает нормально. – SilentMonk
Если в текущем каталоге есть файл с именем, который содержит '2016_05May_30Mo', код, который вы отправили, будет печатать свое имя по своему желанию. – ikegami
любая идея, почему это сработает для вас двоих, а не для меня? – cannonfodder