Что значит `tar cvf fred | flintstonebetty` в системной команде Perl? - PullRequest
1 голос
/ 23 сентября 2010

Что конкретно говорит следующее утверждение?

my @dirs = qw(fred|flintstone <barney&rubble> betty );

Полная история:

my $tarfile = "something*wicked.tar";
my @dirs = qw(fred|flintstone <barney&rubble> betty );
system "tar", "cvf", $tarfile, @dirs;

Это взято из Learning Perl , 4-е издание.

Результат, который system command будет работать на оболочке, будет таким:

tar cvf fred|flintstone <barney&rubble> betty

Но имеет ли эта команда смысл в unix?

Ответы [ 4 ]

5 голосов
/ 23 сентября 2010

С perldoc perlop :

qw/STRING/
           Evaluates to a list of the words extracted out of STRING, using
           embedded whitespace as the word delimiters.  It can be understood
           as being roughly equivalent to:

               split(' ', q/STRING/);

           the differences being that it generates a real list at compile
           time, and in scalar context it returns the last element in the
           list.  So this expression:

               qw(foo bar baz)

           is semantically equivalent to the list:

               'foo', 'bar', 'baz' 
4 голосов
/ 23 сентября 2010

qw() разбивает строку между круглыми скобками через пробелы (пробелы, табуляции, любое их количество) и возвращает список: "fred|flintstone", "<barney&rubble>", "betty"

РЕДАКТИРОВАТЬ : подсказка от @kemp:он возвращает список

А теперь на ваш обновленный вопрос:

tar cvf fred|flintstone <barney&rubble> betty

Да, символы |, <, > и & имеют значения в Linux:

| перенаправляет стандартный вывод с tar cvf fred на стандартный ввод flintstone.

< отправляет файл barney на стандартный ввод flintstone

& запускает предыдущую команду и отправляет ее в фоновый режим

> записывает стандартный вывод rubble в файл betty

Является ли всяСтрока имеет значение, это зависит от отдельных программ.

3 голосов
/ 23 сентября 2010

Создает список следующих значений:

fred|flinstone
<barney&rubble>
betty

и присваивает его массиву @dirs.

qw означает «слова в кавычках», поэтому создает список значений, указанных с использованием пробела в качестве разделителя.

Относительно вашего редактирования: команда unix tar создает архив данных файлов. cvf - это флаги для управления его поведением:

c - create archive
v - verbose mode
f - use following argument as archive name

Далее следует имя файла, в который вы хотите сохранить архив, и список других файлов, которые будут включены в него.

2 голосов
/ 23 сентября 2010

Вы можете использовать Data :: Dumper, чтобы посмотреть, как выглядят dirs:

$ perl -e 'use Data::Dumper; my @dirs = qw(fred|flintstone <barney&rubble> betty ); print Dumper(@dirs);'

$VAR1 = 'fred|flintstone';
$VAR2 = '<barney&rubble>';
$VAR3 = 'betty';

Или благодаря Евгению:

$ perl -e 'use Data::Dumper; my @dirs = qw(fred|flintstone <barney&rubble> betty ); print Dumper \@dirs;'
$VAR1 = [
          'fred|flintstone',
          '<barney&rubble>',
          'betty'
        ];

, что еще лучше!* Quote_and_Quote_like_Operators тоже полезно.Это напоминает QQ QW и так.

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