Товарищи программисты и сочуствующие, не сталкивался ли кто из вас со следующей проблемой:
Имеем некий набор файлов, в котором нужно сделать массовую замену. Имеется привычный метод, как-то:
perl -p -i.old -e 's#foo#bar#' *.txt
(это общий пример, конечно).
Хочется: странного, а именно - чтобы при работе скрипта в командной строке выводилось имя файла, который обрабатывается в данный момент.
Теоретически (не факт что так, но теоретически), скрипт (тот, что в -e), использует while (<>) как источник данных. Вот это <> - это STDIN? А можно ли как-нибудь узнать, какой именно файл сейчас открыт на чтение?
Я понимаю, что все это сделать можно и совсем по-другому. меня интересует именно вариант с -p -e, если он вообще возможен.
Perl command-line quirks
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- mrskhris
- Маньяк
- Сообщения: 2082
- Зарегистрирован: 06 июн 2005, 19:37
- Откуда: RU - KY - NW - CQ
- Контактная информация:
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
Re: Perl command-line quirks
Код: Выделить всё
use strict;
my @files = <*.tmp>;
foreach my $file (@files)
{
print "$file\n";
# do something....
}
- CdR
- Графоман
- Сообщения: 11245
- Зарегистрирован: 11 окт 2004, 19:27
- Откуда: Европа, центр, за углом направо.
Re: Perl command-line quirks
Собственно название файла в $ARGV[0].
Как его использовать -- дело вкуса.
типа такого ?
perl -i.old -p -e 's/foo/bar/ ; print STDERR "$ARGV[0]\r"' *.txt
Как его использовать -- дело вкуса.
типа такого ?
perl -i.old -p -e 's/foo/bar/ ; print STDERR "$ARGV[0]\r"' *.txt
- mrskhris
- Маньяк
- Сообщения: 2082
- Зарегистрирован: 06 июн 2005, 19:37
- Откуда: RU - KY - NW - CQ
- Контактная информация:
Re: Perl command-line quirks
Эмммм... ну типа, но дело не просто в создании списка файловпапа Карло писал(а):что-то типа такого?

Я могу задачу полнее объяснить, но я боюсь, что еще больше все запутаю.
- mrskhris
- Маньяк
- Сообщения: 2082
- Зарегистрирован: 06 июн 2005, 19:37
- Откуда: RU - KY - NW - CQ
- Контактная информация:
Re: Perl command-line quirks
Очевидно, мне надо больше спать. Балда я балда - про $ARGV[0] забыла.CdR писал(а):Собственно название файла в $ARGV[0].
Спасибо. Да, я его через STDERR и сбрасывала куда нужно.
- mrskhris
- Маньяк
- Сообщения: 2082
- Зарегистрирован: 06 июн 2005, 19:37
- Откуда: RU - KY - NW - CQ
- Контактная информация:
Re: Perl command-line quirks
Идея, вроде, хорошая. Но работает несколько странно.CdR писал(а):perl -i.old -p -e 's/foo/bar/ ; print STDERR "$ARGV[0]\r"' *.txt
Пример (упрощенный):
Три файла:
t1.txt, t2.txt, t3.txt
t1.txt: fooText1bar
t2.txt: fooText2bar
t3.txt: fooText3bar
Запускаем следующую команду:
perl -p -i.old -e 's#foo(.*)bar#$1#; print STDERR "$ARGV[0] contains $1\n"' *.txt 2>>log.dat
Результат - log.dat содержит
t2.txt contains Text1
t3.txt contains Text2
contains Text3
По какой-то странной причине, $ARGV[0] съезжает на шаг вперед. Попробовала под cygwin и под RH - результат один и тот же. Похоже, я впадаю в маразм. Что тут происходит, объясните, а?
- CdR
- Графоман
- Сообщения: 11245
- Зарегистрирован: 11 окт 2004, 19:27
- Откуда: Европа, центр, за углом направо.
Re: Perl command-line quirks
ага. +1mrskhris писал(а):Похоже, я впадаю в маразм. Что тут происходит, объясните, а?

- mrskhris
- Маньяк
- Сообщения: 2082
- Зарегистрирован: 06 июн 2005, 19:37
- Откуда: RU - KY - NW - CQ
- Контактная информация:
Re: Perl command-line quirks
Так. Умные люди объяснили.
-p causes Perl to assume the following loop around your program,
which makes it iterate over filename arguments somewhat like sed:
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
Это просто кусок из мана.
А в момент использования while происходит shift на @ARGV. @ARGV при этом содержит не одно имя файла само по себе, а весь список разименованный из маски. Поэтому там и оказывается следующее по списку значение.
(примечание - сдвигаются значения (поочередно) в переменную $ARGV)
-p causes Perl to assume the following loop around your program,
which makes it iterate over filename arguments somewhat like sed:
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
Это просто кусок из мана.
А в момент использования while происходит shift на @ARGV. @ARGV при этом содержит не одно имя файла само по себе, а весь список разименованный из маски. Поэтому там и оказывается следующее по списку значение.
(примечание - сдвигаются значения (поочередно) в переменную $ARGV)
- CdR
- Графоман
- Сообщения: 11245
- Зарегистрирован: 11 окт 2004, 19:27
- Откуда: Европа, центр, за углом направо.
Re: Perl command-line quirks
BTW:mrskhris писал(а):Три файла: t1.txt, t2.txt, t3.txt
t1.txt: fooText1bar
t2.txt: fooText2bar
t3.txt: fooText3bar
Запускаем следующую команду:
perl -p -i.old -e 's#foo(.*)bar#$1#; print STDERR "$ARGV[0] contains $1\n"' *.txt 2>>log.dat
Результат - log.dat содержит
t2.txt contains Text1
t3.txt contains Text2
contains Text3
perl -p -i.old -e 'm#foo(.*)bar#; print STDERR "$ARGV contains $1\n"' *.txt
получаем:
t1.txt contains Text1
t2.txt contains Text2
t3.txt contains Text3
Так что не всё потеряно.
- mrskhris
- Маньяк
- Сообщения: 2082
- Зарегистрирован: 06 июн 2005, 19:37
- Откуда: RU - KY - NW - CQ
- Контактная информация:
Re: Perl command-line quirks

- CdR
- Графоман
- Сообщения: 11245
- Зарегистрирован: 11 окт 2004, 19:27
- Откуда: Европа, центр, за углом направо.
Re: Perl command-line quirks
О, блин. последнюю строку недочитал.mrskhris писал(а):спасибо, но как раз об этом предыдущий пост и есть.