Perl初心者スレ(マジレス回答)
- 1 :デフォルトの名無しさん:2012/10/07(日) 00:48:39.00 .net
- どうぞー
- 470 :デフォルトの名無しさん:2018/11/22(木) 10:12:03.32 ID:iCX1SQ90.net
- >>469
すみません、レス用に書き換えた元が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
読込完了
出力完了
- 471 :デフォルトの名無しさん:2018/11/22(木) 10:30:19.76 ID:Enb78Zev.net
- これでいけると思いましたが、玉砕でしたw
foreach my $row (@$table){
while (my ($id, $count, $name) = each(%row)){
print encode('cp932', "$id\t$count\t$name\n");
}
- 472 :デフォルトの名無しさん:2018/11/22(木) 10:54:51.08 ID:iCX1SQ90.net
- これでいけました!
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
出力完了
- 473 :デフォルトの名無しさん:2018/11/22(木) 11:07:56.03 ID:Enb78Zev.net
- これで全てのハッシュ要素を出力できますが、
カラム順が不確定になってしまいますね。
ハッシュなので仕方ないことですかね。
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
出力完了
- 474 :デフォルトの名無しさん:2018/11/22(木) 12:53:27.47 ID:+z2Jd1go.net
- >>473
キーだけ別の配列に取っといてそれ使えば?
- 475 :デフォルトの名無しさん:2018/11/25(日) 19:58:05.78 ID:Ngr2zrFy.net
- >>474
できれば要素をカラム名でアクセスしたいのでハッシュの方がいいのですが、カラム順固定出力は配列しかないということですね。
- 476 :デフォルトの名無しさん:2018/11/25(日) 21:54:59.45 ID:CqrOufwt.net
- 両方使えば良いのでは たまにやるよ
- 477 :デフォルトの名無しさん:2018/11/26(月) 04:07:41.06 ID:LFi/GsCA.net
- >>473
foreach $col (sort keys %{$table{$row}}) {
を
foreach $col (qw/id count name/) {
とかでは? keyの名前も順番も分かってるんだし。
- 478 :デフォルトの名無しさん:2019/06/24(月) 04:43:33.88 ID:4+LiJo6+.net
- 自分が昔質問したことにたいして今なら回答できる
<> は <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;
- 479 :デフォルトの名無しさん:2019/08/29(木) 20:58:11.72 ID:72vdfcsY.net
- タグを除去したいのですが、<>も文に入っているため
<.*?>ではなく<("[^"]*"|'[^']*'|[^'">])*>を使いたいのですが
perl -pe '<("[^"]*"|'[^']*'|[^'">])*>'
にする場合どれどれをエスケープすればよいでしょうか?
’だけだと動きませんでした。
perl -pe '<("[^"]*"|\'[^\']*\'|[^'">])*>'
- 480 :デフォルトの名無しさん:2019/08/30(金) 12:09:22.02 ID:VkI78Ia/.net
- 除去?だったらs/パターン//gみたいにやらないと何も変わらないのでは?
てか、それエラーにならないの?
- 481 :デフォルトの名無しさん:2019/08/30(金) 13:51:46.18 ID:XCxRWcZV.net
- 5chの書き込みのほう、つけ忘れてました
perl -pe 's/<("[^"]*"|'[^']*'|[^'">])*>//g'
です
perl -pe 's/<.*?>//g'は動くんですけど
perl -pe '<("[^"]*"|\'[^\']*\'|[^'">])*>'だと動かないんですよね
- 482 :デフォルトの名無しさん:2019/08/30(金) 13:52:36.95 ID:XCxRWcZV.net
- またやっちゃった
perl -pe 's/<("[^"]*"|\'[^\']*\'|[^'">])*>//g'
- 483 :デフォルトの名無しさん:2019/08/30(金) 17:21:58.25 ID:8Dc5lx9D.net
- こうか?
perl -pe 's/<("[^"]*"|'"'"'[^'"'"']*'"'"'|[^'"'"'">])*>//g'
perlというよりシェルのシングルクォートの問題
- 484 :デフォルトの名無しさん:2019/08/30(金) 17:42:16.91 ID:fIMZQtfT.net
- そこまでするくらいなら HTML::Parser を使う方がいいと思うよ。
- 485 :デフォルトの名無しさん:2019/08/30(金) 17:56:41.24 ID:XCxRWcZV.net
- >483
できました!、ありがとうございます。
'を'""'で括るのですね
なんで\でエスケープにならないんでしょうね
- 486 :デフォルトの名無しさん:2019/08/30(金) 18:04:26.61 ID:XCxRWcZV.net
- パーサーも一度使ってみたんですが
<p>hoge</p><p>hoge</p>
pタグが一行に2つあると誤作動したりするんですよね
- 487 :デフォルトの名無しさん:2019/08/30(金) 23:22:18.80 ID:fIMZQtfT.net
- その誤作動がパーサーのせいかどうかは判らないが、少なくとも
HTML::Parser でそんなことは起こらないから安心してほしい。
たとえばテキスト部分だけを出力したいならこんな感じでできる。
my $parser = HTML::Parser->new(
text_h => [sub { print( $_[0]) },'text'],
);
$parser->parse_file( \*STDIN);
- 488 :デフォルトの名無しさん:2019/08/31(土) 00:18:32.04 ID:mx6W2BK8.net
- >487
参考になります。
パーサーもいろいろ種類あるみたいですね。
自分の使ってたのはhtml-xml-utilsというやつでした。
- 489 :デフォルトの名無しさん:2021/04/21(水) 00:35:38.31 ID:J2c8I4ei.net
- @aに0を100ケ追加するには、pushをforで100回回す以外の方法ありますか
- 490 :デフォルトの名無しさん:2021/04/21(水) 03:07:59.27 ID:aE0oGLsa.net
- push(@a, (0) x 100);
- 491 :デフォルトの名無しさん:2021/04/27(火) 18:16:47.03 ID:OX0aAdkQ.net
- >>490
ありがとうございました
俺が遅くなりまして申し訳ありません
- 492 :デフォルトの名無しさん:2021/11/19(金) 22:27:21.73 ID:v67hT9Zk.net
- 二つ以上の空白文字列を
一つの空白に変えたいのですが
うまくいきません。
if($line=~/\s\s+/){
$line=~s/\s\s+/\s/g
print("$line\n")
}
- 493 :デフォルトの名無しさん:2021/11/20(土) 02:07:02.21 ID:h6kzSIM/.net
- $line=~s/¥s¥s+/ /g
では?
- 494 :デフォルトの名無しさん:2021/11/20(土) 20:14:01.04 ID:xbsxU5SW.net
- s/\s\s+/ /g;
でうまくいったよ。
そうか、\sって正規表現だから、置換文字列に使うと「perl にそんな定義ないで!」ってなるのか。
これは俺も気を付けよう。
- 495 :デフォルトの名無しさん:2021/11/20(土) 20:36:42.09 ID:xbsxU5SW.net
- 置換といえばこのまえ、JSONで取得したUnicodeを表示したくて、
\u3042 → \N{U+3042}
に置換しようとしたけど、できなかった。
\N{U+ }←ここにはリテラルしか書けないのかな。
- 496 :デフォルトの名無しさん:2021/12/14(火) 19:15:14.22 ID:LP8Fmqr9.net
- if文で真偽値を判定するのってどうやるの?
hoge() or die("Error\n");
ってなってた(hoge()の戻り値が魏ならエラー)のを標準出力したくて
my $a = hoge();
if( ! $a ){ print("Error\n"); exit $!; }
みたいにしたんだけど、if文の書き方ってこんなんで良いの?
- 497 :デフォルトの名無しさん:2021/12/25(土) 19:09:39.02 ID:pJ3Bii8w.net
- >>496
0を返しても、0といb、文字(アスキーコード0x30)として扱われたりするから、俺は
if(scalar($a)) {
とか
if($a eq 0) {
とかするよ。
- 498 :デフォルトの名無しさん:2021/12/25(土) 20:31:09.16 ID:62MjaTIU.net
- >>496
良い。
! で条件反転させるんだったら unless 使っても良いと思うけどね。
unless ($a) { ... } みたいに。
- 499 :デフォルトの名無しさん:2021/12/30(木) 05:41:55.25 ID:grPlj9k3.net
- 良くないんだってば。
Perlをそういう流儀でやってるといつか痛い目にあうよ。
- 500 :494ではない:2021/12/30(木) 08:07:22.12 ID:j5bdR14I.net
- >>497
マジか。
my $a = hoge();
において、左辺が 0、右辺が 0x30 になるのは、言語としてぶっ壊れているんじゃね?
- 501 :デフォルトの名無しさん:2021/12/30(木) 17:49:56.83 ID:QArx8wCq.net
- そういう言語なの
0 but true
なんていう値もあるし
- 502 :デフォルトの名無しさん:2022/01/10(月) 19:33:13.97 ID:2hS04FMw.net
- do what perl mean
- 503 :デフォルトの名無しさん:2022/01/11(火) 00:17:50.61 ID:Xf79Fgui.net
- bool値ほしい
- 504 :デフォルトの名無しさん:2022/03/27(日) 23:43:39.11 ID:TRkpHzjA.net
- >>499
じゃあどうすればいいの?
- 505 :デフォルトの名無しさん:2022/04/28(木) 20:33:01.74 ID:KupWcmJ5.net
- 元の
hoge() or die("Error\n");
が問題なく動いてるなら
hoge() or print("Error\n"), die $!;
- 506 :デフォルトの名無しさん:2022/06/11(土) 13:31:52.57 ID:XcUjU1KU.net
- hoge()が0を返しうるかどうかもわからんと思うのだが
>元の
>hoge() or die("Error\n");
>が問題なく動いてるなら
という前提の下で >>497 の配慮に意味があるの? >>498 で十分
hoge() or が動くという前提を無視するとして
もしもhoge()が0を含む数値か失敗を返すなら(空文字を含む文字列か失敗でもいい)
失敗にundefを返してdefinedで受けるのがフツー
- 507 :デフォルトの名無しさん:2023/12/15(金) 06:59:42.19 ID:aRdlBUAD.net
- $_ ← これ、なんて読む?
perlが発祥ってわけでもないそうだが(bashとかにもあるんだってね)、ガチのドザなので
俺は内心ドルバーって呼んでる
- 508 :デフォルトの名無しさん:2023/12/19(火) 00:32:16.33 ID:LgO8Ui43.net
- ドル・アンダーバーじゃないかな。
設定によってはチルダの代わりにトップバーってのがあったから、それと区別するのにアンダーって言ってた気がする。
- 509 :505:2023/12/21(木) 12:15:47.33 ID:nsa/DjJa.net
- おつあり
そういやそんなの(トップバー)あったねえ なるほど
- 510 :デフォルトの名無しさん:2024/02/09(金) 17:07:48.28 ID:LEmbefGZ.net
- V5.38.2
32ビット
https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/tag/SP_5382_32bit
64ビット
https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/tag/SP_53822_64bit
- 511 :デフォルトの名無しさん:2024/03/03(日) 23:39:10.39 ID:1cRqRnnX.net
- なつかしのcgiゲームを設置したくてperlを触ってるのですが、今の時代でもcgiゲームはサーバーへの負荷は大きいのでしょうか?(昔はよくゲームの設置が禁止されてましたが)
perlと関係なかったらすみません…
- 512 :デフォルトの名無しさん:2024/03/16(土) 03:41:28.53 ID:I49Gallj.net
- StrawberryPerlで
$str='あ';
if ($str =~ /^[あいう]$/) {print("match\n");}
を実行してみるとマッチしてくれません
/^(あ|い|う)$/ ならマッチするのですが
古いPerl4のjperlなら /^[あいう]$/ でもマッチします
やはりこれはStrawberryPerlのバグ(または仕様)なのでしょうか
- 513 :デフォルトの名無しさん:2024/03/16(土) 08:42:58.43 ID:E8XsMGej.net
- print length $str; を入れてみたらわかる
- 514 :デフォルトの名無しさん:2024/03/16(土) 09:03:33.98 ID:E8XsMGej.net
- もしかして: \p{sc=Hiragana}
- 515 :デフォルトの名無しさん:2024/03/16(土) 09:16:48.08 ID:1WMRgWrv.net
- ネタにマジレス
- 516 :デフォルトの名無しさん:2024/03/16(土) 11:57:07.41 ID:Xoe9pkvE.net
- >>513
レスどうもです
Shift-JISの環境で正しく2とカウントされてます
前記はあくまで例ですので全角文字なら他の文字でもこうなるみたいで
ひらがなにマッチさせたいわけではないんです
- 517 :デフォルトの名無しさん:2024/03/16(土) 15:20:26.94 ID:e8kHlvhU.net
- 少なくともperl5.8以降の文字クラスはuse utf8;前提になっててlengthが1じゃないとだめじゃね?
- 518 :デフォルトの名無しさん:2024/03/16(土) 15:27:36.56 ID:HqlfXJdH.net
- 推奨されてないけど
use encoding 'sjis'
ならsjisでコード書けたと思う
jperlナツカシス
- 519 :デフォルトの名無しさん:2024/03/24(日) 16:38:15.53 ID:gHSiAGjm.net
- Windows では Filter::Encoding いれて使ってた
スクリプトは utf-8 で書いて use utf8 してたけど
コマンドラインでは -MFilter::Encoding=cp932 とか
136 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★