Perl初心者スレ(マジレス回答) (523レス)
1-

459: 2018/11/14(水)12:38 ID:XfG22Q3S(2/2) AAS
うっかり自己解決しました。数時間悩んだのに。
print @{ ${ $ref4 }[0] };
print @{ ${ $ref4 }[0] }[1];
460: 2018/11/14(水)19:36 ID:dXHPcciK(1) AAS
>>457
オプションで可能であればと思ったのですが、マッチング文字列と対象を同じ文字種にしないといけないんですね。
ActivePerlでUnicode::Japanese
でUTF8から変換して書いてみたのですが、cp932にencodeすると、化けてしまい、使用できませんでした。
ActivePerlで使用可能なモジュールあればコードではなくてかまいませんので、何かあれば紹介してもらえますでしょうか。
461: 2018/11/14(水)20:41 ID:bryEJhFF(1) AAS
UNICODEにはcomposed、decomposedというややこしいものもあるんだよね。
外部リンク[html]:pointoht.ti-da.net
Unicode::Normalizeってのがあるけど、日本語を特別扱いしてくれたりはしなさそうな予感。
462
(2): 2018/11/14(水)22:57 ID:otO/yyOk(1/2) AAS
>>453-455
Linux では、BOM なしUTF-8 を使う、アプリ開発者が多く、
BOMありにするとバグるアプリがあるから、BOMなしを使っているけど、

そうすると、Windows では、sjis と区別がつかなくなり、
Explorer での文字列検索ができなくなる

だから、Windows10 で、WSL, Ubuntu を導入して、grep を使っている
463: 462 2018/11/14(水)23:51 ID:otO/yyOk(2/2) AAS
結合文字列をUnicode正規化で合成する方法の危険性
外部リンク:qiita.com

濁点・半濁点を別の1文字として扱う、結合文字列はMac だけだから、Mac を使わないなら関係ない

Unicode正規化は、日中韓で、別の漢字に変換されるものがあるから使えない

Ruby では、sjis・UTF-8 の変換は、ファイル読み書き時に指定できる。

CRLF・LF の改行コードの違いは、意識したことがない。
chomp とか、どちらの改行コードでも、正常に動く
464
(1): 462 2018/11/15(木)00:11 ID:g74yzjtM(1) AAS
【 nkf 】コマンド――文字コードと改行コードを変換する
外部リンク[html]:www.atmarkit.co.jp

これで全角・半角の変換もできる

Perl にも、モジュールもあるのでは?
465: 2018/11/21(水)22:55 ID:M0TZNmLm(1/2) AAS
>>464
有料ですがnkfのActivePerl用をnamazuというところから購入しましたが、
nkfで変換後、utf8でマッチングが不可能で調査中です。
466: 2018/11/21(水)23:00 ID:M0TZNmLm(2/2) AAS
ハッシュを要素に持つハッシュへのアクセスについて
ご教示いただけますでしょうか。
下記のコードで、読込は正常に完了しますが、出力が不可能です。
$$を使用したり、試しましたがギブアップです。

#hash.txtの中身(タブ区切り)
#1 10 テスト1
#2 5 テスト2

use Encode;
use utf8;
my %table;
my %rec;

open (FILE, "<:utf8", "hash.txt") or (die "$!");
while(my $line = <FILE>){
 chomp($line);
 @d = split(/\t/, $line);
 %rec = ('id' => $d[0], 'count' => $d[1], 'name' => $d[2]);
 $table{$d[0]} = \%rec;
 print encode('cp932', $table{$d[0]}{'id'})."\t". encode('cp932', $table{$d[0]}{'count'})."\t".encode('cp932', $table{$d[0]}{'name'})."\n";
}
close(FILE);
print Encode::encode('cp932', "読込完了\n");

foreach my $row (@$wrote_num){
 #出力不可能
 print encode('cp932', $row{'id'})."\t". encode('cp932', $row{'count'})."\t".encode('cp932', $row{'name'})."\n";
}
print Encode::encode('cp932', "$出力完了\n");
467
(1): 2018/11/22(木)00:04 ID:V9xGGA7p(1) AAS
wrote_numが何か分からんけど
my %rec; はwhile内にしたらどうですか
あと、$rowはハッシュのリファレンスだろうから$row->{'id'}では
468: 2018/11/22(木)10:12 ID:iCX1SQ90(1/2) AAS
>>467
すみません、レス用に書き換えた元がwote_numでした
下記の様に変えましたが、アクセスできません。
意外と難しいですね。
use Encode;
use utf8;
my %table;

open (FILE, "<:utf8", "hash.txt") or (die "$!");
while(my $line = <FILE>){
chomp($line);
@d = split(/\t/, $line);
my %rec = ('id' => $d[0], 'count' => $d[1], 'name' => $d[2]);
$table{$d[0]} = \%rec;
 print encode('cp932', $table{$d[0]}{'id'})."\t". encode('cp932', $table{$d[0]}{'count'})."\t".encode('cp932', $table{$d[0]}{'name'})."\n";
}
close(FILE);
print Encode::encode('cp932', "読込完了\n");

foreach my $row (@$table){
print encode('cp932', $row->{'id'})."\t". encode('cp932', $row->{'count'})."\t".encode('cp932', $row->{'name'})."\n";
}
print Encode::encode('cp932', "$出力完了\n");

実行結果:まだアクセスできません
>hash_test.pl
1 10 テスト1
2 5 テスト2
読込完了
出力完了
469: 2018/11/22(木)10:30 ID:Enb78Zev(1/2) AAS
これでいけると思いましたが、玉砕でしたw

foreach my $row (@$table){
 while (my ($id, $count, $name) = each(%row)){
 print encode('cp932', "$id\t$count\t$name\n");
}
470: 2018/11/22(木)10:54 ID:iCX1SQ90(2/2) AAS
これでいけました!
foreach my $row (keys %table){
 print encode('cp932', "$table{$row}{'id'}\t$table{$row}{'count'}\t$table{$row}{'name'}\n");
}
>hash_test.pl
1 10 テスト1
2 5 テスト2
読込完了
1 10 テスト1
2 5 テスト2
出力完了

ただ、key を外して foreach my $row (%table)とすると下記の通り改行が入ります
1 10 テスト1

2 5 テスト2

出力完了
471
(2): 2018/11/22(木)11:07 ID:Enb78Zev(2/2) AAS
これで全てのハッシュ要素を出力できますが、
カラム順が不確定になってしまいますね。
ハッシュなので仕方ないことですかね。

foreach $row (sort keys %table) {
 foreach $col (sort keys %{$table{$row}}) {
 print encode('cp932', "$table{$row}{$col}\t");
}
print "\n";
}
>hash_test.pl
1 10 テスト1
2 5 テスト2
読込完了
5 2 テスト2
10 1 テスト1
出力完了
472
(1): 2018/11/22(木)12:53 ID:+z2Jd1go(1) AAS
>>471
キーだけ別の配列に取っといてそれ使えば?
473: 2018/11/25(日)19:58 ID:Ngr2zrFy(1) AAS
>>472
できれば要素をカラム名でアクセスしたいのでハッシュの方がいいのですが、カラム順固定出力は配列しかないということですね。
474: 2018/11/25(日)21:54 ID:CqrOufwt(1) AAS
両方使えば良いのでは たまにやるよ
475: 2018/11/26(月)04:07 ID:LFi/GsCA(1) AAS
>>471
foreach $col (sort keys %{$table{$row}}) {

foreach $col (qw/id count name/) {
とかでは? keyの名前も順番も分かってるんだし。
476: 2019/06/24(月)04:43 ID:4+LiJo6+(1) AAS
自分が昔質問したことにたいして今なら回答できる
<> は <STDIN> の単なる略ではなく
@ARGV が捕れない副作用があった
そこに詰まっていた

#!/usr/bin/env perl
use 5.010;

if (-p STDIN) {

print "May be pipe is used. I've got STDIN as below\n";

# my @lines = <STDIN>; # when <> used, perl think no @ARGV

map {state $i; ++$i;print "$i $_" } <STDIN>;

}

else {

print "This may be just single running.\n";

}

map {state $i; ++$i; print "$i argment found ==> $_\n"} @ARGV;
477: 2019/08/29(木)20:58 ID:72vdfcsY(1) AAS
タグを除去したいのですが、<>も文に入っているため
<.*?>ではなく<("[^"]*"|'[^']*'|[^'">])*>を使いたいのですが
perl -pe '<("[^"]*"|'[^']*'|[^'">])*>'
にする場合どれどれをエスケープすればよいでしょうか?
’だけだと動きませんでした。
perl -pe '<("[^"]*"|\'[^\']*\'|[^'">])*>'
478: 2019/08/30(金)12:09 ID:VkI78Ia/(1) AAS
除去?だったらs/パターン//gみたいにやらないと何も変わらないのでは?
てか、それエラーにならないの?
479: 2019/08/30(金)13:51 ID:XCxRWcZV(1/4) AAS
5chの書き込みのほう、つけ忘れてました
perl -pe 's/<("[^"]*"|'[^']*'|[^'">])*>//g'
です

perl -pe 's/<.*?>//g'は動くんですけど

perl -pe '<("[^"]*"|\'[^\']*\'|[^'">])*>'だと動かないんですよね
480: 2019/08/30(金)13:52 ID:XCxRWcZV(2/4) AAS
またやっちゃった
perl -pe 's/<("[^"]*"|\'[^\']*\'|[^'">])*>//g'
481
(1): 2019/08/30(金)17:21 ID:8Dc5lx9D(1) AAS
こうか?
perl -pe 's/<("[^"]*"|'"'"'[^'"'"']*'"'"'|[^'"'"'">])*>//g'
perlというよりシェルのシングルクォートの問題
482: 2019/08/30(金)17:42 ID:fIMZQtfT(1/2) AAS
そこまでするくらいなら HTML::Parser を使う方がいいと思うよ。
483: 2019/08/30(金)17:56 ID:XCxRWcZV(3/4) AAS
>481
できました!、ありがとうございます。
'を'""'で括るのですね
なんで\でエスケープにならないんでしょうね
484: 2019/08/30(金)18:04 ID:XCxRWcZV(4/4) AAS
パーサーも一度使ってみたんですが
<p>hoge</p><p>hoge</p>
pタグが一行に2つあると誤作動したりするんですよね
485
(1): 2019/08/30(金)23:22 ID:fIMZQtfT(2/2) AAS
その誤作動がパーサーのせいかどうかは判らないが、少なくとも
HTML::Parser でそんなことは起こらないから安心してほしい。
たとえばテキスト部分だけを出力したいならこんな感じでできる。

my $parser = HTML::Parser->new(
text_h => [sub { print( $_[0]) },'text'],
);
$parser->parse_file( \*STDIN);
486: 2019/08/31(土)00:18 ID:mx6W2BK8(1) AAS
>485
参考になります。
パーサーもいろいろ種類あるみたいですね。

自分の使ってたのはhtml-xml-utilsというやつでした。
487: 2021/04/21(水)00:35 ID:J2c8I4ei(1) AAS
@aに0を100ケ追加するには、pushをforで100回回す以外の方法ありますか
488
(1): 2021/04/21(水)03:07 ID:aE0oGLsa(1) AAS
push(@a, (0) x 100);
1-
あと 35 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.007s