Следующий скрипт представляет собой довольно хитрое использование модуля perl Text::CSV
. Обычно он используется для синтаксического анализа и вывода правильно отформатированных CSV-файлов, но здесь я просто использую его для метода say()
, потому что я не хочу писать свой собственный код для правильного цитирования полей там, где это необходимо (, т. е. когда они содержать пробел, перевод строки -, двойную -кавычку или запятую ).
#!/usr/bin/perl -an
use Text::CSV qw(csv);
BEGIN {
$csv=Text::CSV->new();
# define our column headers in the right order.
@columns = ("Id", "surface area (mm^2)", "gray matter volume (mm^3)",
"avg cortical thickness +- sd (mm)", "mean curvature",
"gaussian curvature", "folding index", "curvature index", "hemi", "ROI");
# output them as a CSV field header.
$csv->say(*STDOUT, \@columns );
};
# skip lines that don't begin with a digit
next unless /^\d/;
# Split the subject (field 10) into multiple sub-fields
# perl arrays start from 0, so the 10th field is $F[9].
# This will split it into an array like:
# SUBJECT 89765432 label lh APD57 20d label
# 0 1 2 3 4 5 6
my @subject=split(/[\/_.]/,$F[9]);
# Insert the first two of those sub-fields at the beginning of the input array
# as one new field joined by an underscore.
unshift @F, $subject[0]. "_". $subject[1];
# Inserting that field means that field 10 is now field 11 - i.e. $F[9] is now $F[10].
# Replace it with the hemi value, and add a new ROI field at the end.
$F[10]=$subject[3];
push @F, $subject[5];
# print it as properly-formatted CSV.
$csv->say(*STDOUT, \@F);
Выход:
Id,"surface area (mm^2)","gray matter volume (mm^3)","avg cortical thickness +- sd (mm)","mean curvature","gaussian curvature","folding index","curvature index",hemi,ROI
SUBJECT_89765432,72,6.18,1307,87.23,987,0.566,2,3,1.8,lh,20d
Решение . Добавьте следующие правила в/etc/pf.conf
:
anchor "multicast" {
pass proto igmp allow-opts
pass quick from any to { 224.0.0.0/4 ff00::/8 } allow-opts
}
(также можно вынести правила в отдельный файл и прикрепить их к якорю, см. руководство по PF)
sudo sysctl net.inet.igmp.sendra=0
хак больше не нужен.
Источник вопроса . Приложение Private Internet Access включает брандмауэр PF и загружает собственные правила, которые явно отключают IGMP/многоадресную рассылку. Это происходит, даже если приложение PIA не запущено. Я связался со службой поддержки PIA, надеясь, что они это исправят.
Детали расследования .
tcpdump
показал, что компьютеры Mac не отвечают на запросы IGMP от маршрутизатора. sudo pfctl -d
фиксированных ответов IPTV и IGMP. /etc/pf.conf
(правила Apple по умолчанию ), не имело никакого эффекта, затем я обнаружил правила PIA черезsudo pfctl -sr
:anchor "com.privateinternetaccess.vpn/*" all
.